(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)再生&確認
- ゲームを再生
- 敵をロックオンして左クリック
- 時間差で敵を破壊できれば成功です。
- 左クリックした後、すぐに照準器を移動させてみよう!
- すると、動かした地点に着弾します。
- この機能をうまく使えば、発射後、敵が移動回避すると『着弾失敗』というギミックを作ることができます。