(Unity)ロックオンした敵を破壊する

(1)プレーヤーの作成

  • 「Capsule」「Main Camera」「Create Empty」の3つのオブジェクトで簡単にプレーヤーを作成
  • 親子関係にして、一体となって動くようにする。

  • Body部分は透明化しておく。

 

(2)照準器の作成

  • 「画像データ(自由)」と「UI Image」オブジェクトを使って、Canvas上に照準器を作成
  • 画像データは『白抜き』を推奨(敵を補足した場合、「色を変化」させるので)

 

(3)スクリプトその1(マウス操作で視点を変える)

  • 新規にC#スクリプトを作成
  • 名前を「MouseLook」に変更
  • 下記のコードを書いてチェック

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

public class MouseLook : MonoBehaviour
{
    public Transform player;
    private float mouseSensitivity = 200f;
    private float xRotation = 0;

    void Start()
    {
        // 画面上からカーソル表示を消す。
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

        xRotation -= mouseY;

        // 上下の視点移動に制限を加える
        xRotation = Mathf.Clamp(xRotation, -90f, 90f);
        transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);

        // 左右の視点移動は、プレーヤーとの親子関係を利用する
        player.Rotate(Vector3.up * mouseX);
    }
}

(4)設定

  • スクリプトを「Main Camera」オブジェクトに追加する。
  • 空欄にPlayerオブジェクトをドラッグ&ドロップ

  • これで設定完了
  • ゲームを再生して確認
  • マウスの動きで視点が、上下左右に移動すれば成功です。
  • 上下の視点移動には制限があることも確認する。

 

(5)スクリプトその2(敵を補足したら照準器を赤く変化させる)

  • MouseLookスクリプトに下記のコードを追加してチェック

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// ★追加(照準器の色の変化)
using UnityEngine.UI;

public class MouseLook : MonoBehaviour
{
    public Transform player;
    private float mouseSensitivity = 200f;
    private float xRotation = 0;

    // ★追加(照準器の色の変化)
    public Image aimImage;
    private RaycastHit enemyHit;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

        xRotation -= mouseY;

        xRotation = Mathf.Clamp(xRotation, -90f, 90f);
        transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);

        player.Rotate(Vector3.up * mouseX);

        // ★追加(照準器の色の変化)
        Ray ray = new Ray(transform.position, transform.forward);

        if(Physics.Raycast(ray, out enemyHit, 100))
        {
            string hitName = enemyHit.transform.gameObject.tag;

            if(hitName == "Enemy")
            {
                // 照準器を赤に変化させる
                aimImage.color = Color.red;
            }
            else
            {
                aimImage.color = Color.white;
            }
        }
        else
        {
            aimImage.color = Color.white;
        }
    }
}

 


(6)設定

  • 空欄にAimイメージオブジェクトをドラッグ&ドロップ

 

  • 好きな形のオブジェクトを作成
  • 「Tag」に「Enemy」と設定(ポイント)

 

(7)再生&確認

  • ゲームを再生
  • 照準器で敵を補足した瞬間に照準器が赤色に変化すれば成功です。

 

(8)スクリプトその3(マウスクリックで補足した敵を破壊する)

  • 補足した敵を、マウスの左クリックで破壊できるようにします。
  • ただし、即座に破壊すると面白くないので、Invokeメソッドを使って『時間差』を生み出します。
  • これによって、『砲弾の発射』と『着弾』にタイムラグが生じてリアイリティが向上します(ただし、全てギミック)

 

  • MouseLookスクリプトに下記のコードを追加してチェック

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

public class MouseLook : MonoBehaviour
{
    public Transform player;
    private float mouseSensitivity = 200f;
    private float xRotation = 0;

    public Image aimImage;
    private RaycastHit enemyHit;

    // ★★追加(敵の破壊)
    public AudioClip shotSound;
    public AudioClip destroySound;
    public GameObject effectPrefab;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
        float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;

        xRotation -= mouseY;

        xRotation = Mathf.Clamp(xRotation, -90f, 90f);
        transform.localRotation = Quaternion.Euler(xRotation, 0f, 0f);

        player.Rotate(Vector3.up * mouseX);

        Ray ray = new Ray(transform.position, transform.forward);

        if(Physics.Raycast(ray, out enemyHit, 100))
        {
            string hitName = enemyHit.transform.gameObject.tag;

            if(hitName == "Enemy")
            {
                aimImage.color = Color.red;

                // ★★追加(敵の破壊)
                // 左クリック
                if (Input.GetMouseButtonDown(0))
                {
                    // 発射音を出す
                    AudioSource.PlayClipAtPoint(shotSound, Camera.main.transform.position);

                    // Invokeメソッドで時間差を生み出す
                    Invoke("DestroyEnemy", 0.7f);
                }
            }
            else
            {
                aimImage.color = Color.white;
            }
        }
        else
        {
            aimImage.color = Color.white;
        }
    }

    // ★★追加(敵の破壊)
    void DestroyEnemy()
    {
        if(enemyHit.transform.gameObject)
        {
            GameObject effect = Instantiate(effectPrefab, enemyHit.point, Quaternion.identity);
            Destroy(effect, 1.0f);
            AudioSource.PlayClipAtPoint(destroySound, transform.position);
        }

        // 破壊すべきものは「Enemy」のTagが付いているものに限定する。
        if(enemyHit.transform.CompareTag("Enemy"))
        {
            Destroy(enemyHit.transform.gameObject);
        }
    }
}

 


(9)設定

  • 2種類の効果音(発射音と破壊音)と、破壊時のエフェクトを設定

 

(10)再生&確認

  • ゲームを再生
  • 敵をロックオンして左クリック
  • 時間差で敵を破壊できれば成功です。

  • 左クリックした後、すぐに照準器を移動させてみよう!
  • すると、動かした地点に着弾します。
  • この機能をうまく使えば、発射後、敵が移動回避すると『着弾失敗』というギミックを作ることができます。