banner
YZ

周周的Wiki

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

unity生涯の始まり——宇宙船ミニゲーム制作

Unity で作成した小さなデモの初歩

1、宇宙船などのシーンの設定
シーンレイアウト:ライトを適切な位置に配置し、カメラをライトの上に移動させ、シーン内に新しい quad を作成して背景として使用し、マテリアルを貼り付け、宇宙船プレイヤーをシーンにドラッグして位置を調整し、宇宙船の尾に炎のエフェクトを追加します。

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、弾丸の飛行とプレハブ
Hierarchy で新しいゲームエンプティを作成し、名前を bolt とし、新しい quad を作成して bolt の子オブジェクトとして、マテリアルを貼り付け、弾丸のモデルを設定し、弾丸を宇宙船の下に配置し、弾丸の飛行スクリプト bolt_move.cs を作成します:

 public float speed = 5.0f;
    //z軸正方向に飛行
	// フレームごとに更新
	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 をクリックし、インスペクタで設定を完了します:

実行すると、弾丸が飛行機の下から発射されます。

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、タグを追加
as_move.cs スクリプトに以下のコードを追加します:
// 小惑星のリジッドボディとコライダーのトリガー、boundary にはコライダーのトリガーがあり、トリガーに入ると自然に反応します。

 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);
        //宇宙船の位置で爆発エフェクトをインスタンス化
        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 WaitForSeconds(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;
            }
        }
    }
	// 初期化に使用
	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);
        }

シーンで以下の設定を行います:
ここに画像の説明を挿入
ここに画像の説明を挿入

これで、宇宙船の小さなゲームが基本的に完成しました。

ここに画像の説明を挿入

ゲームを実行します:

ここに画像の説明を挿入

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。