banner
YZ

周周的Wiki

种一棵树最好的时间是十年前,其次是现在。
zhihu
github
csdn

unity生涯的開始——太空飛船小遊戲製作

初識 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);
        }

在場景裡做如下設定:
在這裡插入圖片描述
在這裡插入圖片描述

至此,一個太空飛船小遊戲基本完成了

在這裡插入圖片描述

運行遊戲:

在這裡插入圖片描述

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。