初識 unity 做的一個小 demo
1、飛船等場景的設置
場景佈局:把燈光放到合適的位置,攝像機拉到燈光上方,在 scene 裡面新建一個 quad 作為背景,給它貼上材質圖,把飛船 player 拖到場景中,調整位置,在飛船尾巴添加一個噴火特效。
2、給飛船寫一個飛行腳本
Player.cs:
public float speed = 5.0f;
float moveH = Input.GetAxis("Horizontal");
float moveV = Input.GetAxis("Vertical");
Vector3 move = new Vector3(moveH, 0, moveV);
transform.Translate(speed * move * Time.deltaTime);
在 unity 裡把 player.cs 拖拽到飛船那裡,作為飛船的子對象,這樣用鍵盤上上下左右鍵就可以控制飛船運動了。
3、做子彈的飛行和 prefab
在 hierarchy 新建一個 game empty 命名為 bolt,新建一個 quad,作為 bolt 子對象,給它貼上一個 materials,子彈的模型,調整子彈在飛船下方的位置,也給子彈做一個飛行腳本 bolt_move.cs:
public float speed = 5.0f;
//沿著z軸正方向飛行
// Update is called once per frame
void Update () {
// transform.Translate(0,0,speed*Time .deltaTime);
transform.Translate(Vector3.forward * speed * Time.deltaTime);
同樣把腳本拖到子彈那裡
給子彈添加剛體組件和膠囊體碰撞器:
給子彈做一個預製包,放到_prefab 裡:
直接把 hierarchy 裡的 bolt 拖拽到 assets 裡的_prefab 就行。
4、子彈的發射
做一個子彈發射的腳本,放到 player 裡:
//時間間隔
public float fireRate = 0.5f;
//每隔0.5f發射子彈
public float nextFire = 0.0f;
public GameObject shot;
public Transform shotSpawn;
//點擊鼠標發射子彈
if (Input.GetButton("Fire1") && Time.time > nextFire)
{
//存在問題的一系列的子彈出來了,需要用時間控制子彈的發射
nextFire = Time.time + fireRate;
//Instantiate(實例化物體‘位置’角度)
Instantiate(shot, shotSpawn.position, shotSpawn.rotation);
點擊 player,在 inspector 完成設置:
運行一下,子彈就會從飛機下方發射出來。
5、子彈的銷毀和碰撞檢測
新建一個 cube 命名為 boundary,調整大小,位置,使它把飛船包圍住
做一個子彈銷毀的腳本 destbyboundary.cs:
void OnTriggerExit(Collider other)
{
Destroy(other.gameObject);
}
拖拽到 boundary 裡:
相關設置如下
運行一下,子彈飛行出 boundary 邊界的時候就是銷毀。
6、添加隕石運動和銷毀
新建一個 gameobject 命名為 Asterial,拖拽一個隕石模型作為子對象,調整其在場景中的位置,給它做一個運動腳本 as_move.cs:
public float speed = 5.0f;
void Update () {
transform.Translate(Vector3.back * speed * Time.deltaTime);
}
並為其添加剛體組件和膠囊體碰撞器
同時給它做一個預製包,一會要自動出現。
7、添加 tag
在 as_move.cs 腳本中添加下面代碼:
// 小行星 rigidbody 和 collider trigger,boundary 有 collider trigger,當 trigger enter 的時候自然會響應了。
void OnTriggerEnter(Collider other)
{
//print(other.name);//相應的名稱就是boundary,銷毀就是boundary,所以需要修改一下
//實例化粒子物體
if (other.tag == "Boundary")
return;
gameController.GameOver();
Destroy(other.gameObject);
}
在此做屬性響應修改。
8、隕石和飛船的爆炸
在 as_move.cs 添加如下代碼:
public GameObject explosion;
public GameObject playerExplosion;
//實例化小行星的爆炸粒子效果,在小行星的位置處生成粒子效果
Instantiate(explosion, transform.position, transform.rotation);
//實例化player,也就是飛船的爆炸例子效果,在飛船的位置處生成粒子效果
if (other.tag == "Player")
{
Instantiate(playerExplosion, other.transform.position, other.transform.rotation);
}
Destroy(other.gameObject);
//小行星被擊中後玩家分值增加,需要把增加的這個過程通知到Text控件顯示
gameController.AddScore(scoreValue);
Destroy(gameObject);
}
如圖設置
運行之後就會出現射擊隕石和碰撞之後的爆炸效果了。
9、隕石批量生成:
這裡要用到一個協程的方法:
IEnumerator WaitAndPrint()
{
yield return new WaitForSecond(5);
print(“WaitAndPrint”+Time.time);
}
新建一個 gameobject 命名為 gamecontroller,新建腳本 gamecontroller.cs:
//實例化小行星的物體,位置
public GameObject hazard;//代表小行星物體
public Vector3 spawnValues;//代表生成的x軸和z軸的變化值
private Vector3 spawnPosition = Vector3.zero;//代表生成位置
private Quaternion spawnRotation;
public int hazardCount = 6;
//延遲生成的時間
public float spawnWait;
//不希望遊戲一開始就立刻產生小行星,而是等待一段時間,加人變量來控制等待時間
public float startWait = 1.0f;
//生成小行星的代碼
IEnumerator SpawnWaves()
{
yield return new WaitForSeconds(startWait);
while (true)
{
for (int i = 0; i < hazardCount; i++)
{
spawnPosition.x = Random.Range(-spawnValues.x, spawnValues.x);
spawnPosition.z = spawnValues.z;
spawnRotation = Quaternion.identity;
Instantiate(hazard, spawnPosition, spawnRotation);
yield return new WaitForSeconds(spawnWait);
}
yield return new WaitForSeconds(2.0f);
void Start () {
StartCoroutine(SpawnWaves());
}
根據場景設置所需參數
運行一下隕石就可以隨機生成了。
10、做一個不同腳本之間的一種數據傳遞,做一個遊戲的生命周期:記錄得分,遊戲結束,和重新開始
在 as_move.cs 添加如下代碼:
private GameController gameController;
public int scoreValue;//增加的分值
gameController.GameOver();
void Start()
{
//將這裡定義的gamecontroller和之前的gamecontroller綁定,一般來說
//所以我們先通過findwithtag找到物體,得通過getcomponent找到gamecontroller腳本
GameObject go = GameObject.FindWithTag("GameController");//注意,必須在屬性響應那裡做修改
if (go != null)
gameController = go.GetComponent<GameController>();
else
Debug.Log("找不到tag為GameController的對象");
if (gameController == null)
Debug.Log("找不到腳本GameController.cs");
}
在 gamecontroller.cs 添加如下代碼:
public Text ScoreText;
private int score;
public Text gameOverText;
private bool gameOver;
public Text restartText;
private bool restart;
if (gameOver)
{
restartText.text = "按【R】重新開始";
restart = true;
break;
}
}
}
// Use this for initialization
void Start () {
score = 0;
ScoreText.text = "得分: " + score;
gameOverText.text = "";
gameOver = false;
restartText.text = "";
restart = false;
StartCoroutine(SpawnWaves());
}
//修改分值
public void AddScore(int newScoreValue)
{
score += newScoreValue;
ScoreText.text = "得分: " + score;
}
//修改結束的屬性
public void GameOver()
{
gameOver = true;
gameOverText.text = "遊戲結束";
}
void Update()
{
if (restart)
{
if (Input.GetKeyDown(KeyCode.R))
Application.LoadLevel(Application.loadedLevel);
}
在場景裡做如下設置:
至此,一個太空飛船小遊戲基本完成了
運行遊戲: