Unityでゲームを作ろう

Unityを使ったゲーム開発と学習方法や勉強会の記録など

【3Dシューティングゲーム】第一回 オブジェクトの配置

Unityを使用した簡単な3D迷路シューティングゲームの作り方を紹介します。この内容は Unityワークショップ勉強会 - Unityでゲームを作ろう のを元にしています。

  • 今回の概要
  • プロジェクトを作る
  • オブジェクトの配置
    • 土台 の生成
      • 見た目を変える
    • 壁の作成
    • 出口の作成
    • 内壁の作成
      • プレハブ化
  • Hierarchy の整理
  • 次のステップ
続きを読む

4. 敵実装(ソースコードのみ)

ソースファイル

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour {
    public int HP = 10;  // PlayerのHP

    // ダメージを受けたとき
    public void OnDamage(int damage)
    {
        HP -= damage;
    }
}


PlayerShot.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerShot : MonoBehaviour {

    // 弾のスピード
    public float speed = 1.0f;

    // 弾が持っているRigidBody
    public Rigidbody rigid;
	
	// Update is called once per frame
	void Update () {

        // 物理で自分自身が進む力を、
        // 自分が向いている方向にspeed分だけ進むように強制書き換え
        rigid.velocity = transform.forward * speed;

        //// 自分の位置を、自分の位置 +
        //// 自分の向いている前方向ベクトル ✕ speedに変更する.
        //rigid.MovePosition(transform.position +
        //    transform.forward * speed);
    }

    // コライダーが当たったことを検知したとき
    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("コライダーがあたったよ!");
        //// 何かに当たったら自分を消す
        //GameObject.Destroy(gameObject);
        //// 何かに当たったら当たったやつを消す
        //GameObject.Destroy(collision.gameObject);
    }

    // トリガーが当たったことを検知する
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("トリガーがあたったよ!");
        // 何かに当たったら自分を消す
        GameObject.Destroy(gameObject);
    }
}

PlayerShooter.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerShooter : MonoBehaviour {

    // 弾オブジェクトのプレハブ
    [SerializeField]
    GameObject shotPrefab;

    // 弾を生成するポイント.
    [SerializeField]
    GameObject shotPoint;

    // 弾を格納する空のゲームオブジェクト.
    [SerializeField]
    GameObject shotRoot;

    // 弾が生成される間隔(秒).
    [SerializeField]
    float shotInterval = 0.3f;

    // 前回弾を撃った時間.
    float prevShotTime = 0;
    
	// Update is called once per frame
	void Update () {
        // Zキーが押されたら、自分と同じ場所に弾オブジェクトを生成する.
        if (Input.GetKey(KeyCode.Z) && Time.time - prevShotTime > shotInterval)
        {
            // 弾が打たれたら前回弾が撃たれた時間を更新.
            prevShotTime = Time.time;

            GameObject newShot = Instantiate(shotPrefab);
            newShot.transform.position = shotPoint.transform.position;
            newShot.transform.rotation = shotPoint.transform.rotation;

            newShot.transform.parent = shotRoot.transform;
        }
    }
}

EnemyShot.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerShot : MonoBehaviour {

    // 弾のスピード
    public float speed = 1.0f;

    // 弾が持っているRigidBody
    public Rigidbody rigid;
	
	// Update is called once per frame
	void Update () {

        // 物理で自分自身が進む力を、
        // 自分が向いている方向にspeed分だけ進むように強制書き換え
        rigid.velocity = transform.forward * speed;

        //// 自分の位置を、自分の位置 +
        //// 自分の向いている前方向ベクトル ✕ speedに変更する.
        //rigid.MovePosition(transform.position +
        //    transform.forward * speed);
    }

    // コライダーが当たったことを検知したとき
    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("コライダーがあたったよ!");
        //// 何かに当たったら自分を消す
        //GameObject.Destroy(gameObject);
        //// 何かに当たったら当たったやつを消す
        //GameObject.Destroy(collision.gameObject);
    }

    // トリガーが当たったことを検知する
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("トリガーがあたったよ!");
        // 何かに当たったら自分を消す
        GameObject.Destroy(gameObject);
    }
}

EnemyShooter.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyShooter : MonoBehaviour {

    // 弾オブジェクトのプレハブ
    [SerializeField]
    GameObject shotPrefab;

    // 弾を生成するポイント.
    [SerializeField]
    GameObject shotPoint;

    // 弾を格納する空のゲームオブジェクト.
    [SerializeField]
    GameObject shotRoot;

    // 弾が生成される間隔(秒).
    [SerializeField]
    float shotInterval = 0.3f;

    // 前回弾を撃った時間.
    float prevShotTime = 0;
    
	// Update is called once per frame
	void Update () {
        // Zキーが押されたら、自分と同じ場所に弾オブジェクトを生成する.
        if (Time.time - prevShotTime > shotInterval)
        {
            // 弾が打たれたら前回弾が撃たれた時間を更新.
            prevShotTime = Time.time;

            GameObject newShot = Instantiate(shotPrefab);
            newShot.transform.position = shotPoint.transform.position;
            newShot.transform.rotation = shotPoint.transform.rotation;

            newShot.transform.parent = shotRoot.transform;
        }
    }
}

3.ショット実装

「Unityで個人開発をしたい人のための 3Dゲーム試作ワークショップ -トライコア勉強会- #3」の講義内容のまとめ
ショットの生成までの内容の要点抜粋になります。
※ 暫定的な記載な為、後日補足します

  • ゲームオブジェクトのInstantinate
    • 弾の作成
    • スクリプトの作成
    • 弾を生成する場所を決める
  • ショットの発射
  • 落ちる球の当たり判定
  • ショットと敵の当たり判定
続きを読む