今回はマウス操作で動く照準を作成し、敵を倒す機能を作成していきます。
敵をマウスクリックで倒すゲームを作成する時、マウスに追従する照準のUIを作成しマウスポインタを非表示にするかまたはマウスポインタ自体を照準のテクスチャにしてしまう方法があります。
今回はマウスポインタ自体を照準のテクスチャに変更し、敵をマウスで押した時に消すようにしてみます。
銃と手の一部を表示したFPS(FirstPersonShooter)でも応用は利きますが、
マウスポインタ自体を照準のテクスチャにする場合照準が一番手前に表示されてしまう為、銃や手の上に照準が表示されてしまいます。
それの対処は後でやってみます。
照準画像を用意してUnityに取り込み、設定を行う
まずは照準の画像をUnityに取り込んでみます。
ご自分で照準の画像を用意して頂くか、わたくしが作った照準を使ってください。
Unityのメニュー→Assets→Import New Assetで画像を選択するか
画像をUnityのAssetsメニューにドラッグ&ドロップします。
取り込んだらTexture TypeをCursorに変更し、Max Sizeを32に変更します。(わたくしの画像を使う場合)
マウスカーソルの変更と攻撃処理のCursorShotScriptスクリプトの作成
Main Cameraにカーソルを変更と敵を攻撃するスクリプトCursorShotScriptを作り取りつけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | using UnityEngine; using System.Collections; public class CursorShotScript : MonoBehaviour { // カーソルに使用するテクスチャ [SerializeField] private Texture2D cursor; void Start () { // カーソルを自前のカーソルに変更 Cursor.SetCursor(cursor, new Vector2(cursor.width / 2, cursor.height / 2), CursorMode.ForceSoftware); } void Update () { // マウスの左クリックで撃つ if(Input.GetButtonDown("Fire1")) { Shot(); } } // 敵を撃つ void Shot() { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if(Physics.Raycast(ray, out hit, 100f, LayerMask.GetMask("Enemy"))) { Destroy(hit.collider.gameObject); } } } |
Startメソッド内でCursor.SetCursorを使い自前のテクスチャをカーソルに設定します。
第2引数にはテクスチャの左上からのオフセット値を指定します。
カーソルの中心を画像の真ん中にする為に画像の横幅と縦幅の半分を第2引数に指定します。
これで照準の真ん中がカーソルの真ん中となります。
マウスの左ボタンを押した時に敵と当たっているか判定するShotメソッドを呼び出します。
1 2 3 | Camera.main.ScreenPointToRay(Input.mousePosition) |
でメインのカメラからレイ(線)をマウスの位置に飛ばします。
Physics.RaycastでEnemyレイヤーに設定されているゲームオブジェクトコライダと接触した場合にそのコライダのゲームオブジェクトを消去しています。
敵キャラクターにコライダを設定し、マウスを押して消えるか確認
それではスクリプトの作成が終わったので、敵キャラクターを設置し、敵キャラクターにコライダを設定してください。
また敵キャラクターのレイヤーをEnemyに設定します。(レイヤーがない場合は作成してください)
上の画像のようになりました。
またCursorShotScriptのインスペクタのcursorにさきほど取り込んだ照準を設定します。
それではUnityの実行ボタンを押して確認してみます。
上の動画のようにマウスカーソルの変更とマウスで敵を倒す事が出来るようになりました。
少しだけFPS風に銃を配置してみる
では少しFPS風に銃を登場させてみます。
まずは銃をAsset Storeで探します。
検索でAssault Rifle A3を探し、インポートします。
銃のモデルを選択しインスペクタのModelのScale Factorを変更し、キャラクターのサイズと合うように調整します。
上のように銃のサイズ、位置を変更し表示します。
銃のモデルが途中から表示されてしまう場合は銃がカメラの表示から近すぎる位置に配置されているかもしれません。
Main CameraのClipping PlaneのNearの設定でカメラの描画範囲で描画を始める一番近い距離を指定出来るので、その数値を小さくします。
銃の向きをマウスカーソルの方向へ向かせる処理を追加する
銃はマウスカーソルの位置の方向を向かせたいのでCursorShotスクリプトのUpdateメソッドに処理を追加します。
また、銃の角度を変更するようにしたのでMain Cameraに取り付けていたCursorShotScriptを銃のゲームオブジェクトに設定するようにします。
1 2 3 4 5 6 7 8 9 10 11 | void Update () { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); transform.rotation = Quaternion.LookRotation(ray.direction); // マウスの左クリックで撃つ if(Input.GetButtonDown("Fire1")) { Shot(); } } |
メインのカメラからマウスの位置にレイを飛ばしray.directionでレイの方向を取得します。
Quaternion.LookRotationで方向の角度が取得出来るので、その角度を銃の角度に設定します。
これで銃がマウスカーソルの方向を向くようになります。
マウスカーソルが銃の手前に表示されてしまう問題
それでは銃の処理も出来たので確認してみます。
照準が銃の手前に表示されてしまっています。
これは照準がマウスカーソルという事を思い出すとわかりますが、マウスカーソルなのでどんなゲームオブジェクトより手前に表示されます。
銃とマウスカーソルが被ったらマウスカーソルを非表示にする
これでは困るので、銃にコライダを設定し、マウスカーソルが銃のコライダと被った場合は非表示にするようにします。
銃にコライダを追加します。
上のように大雑把ではありますがBox Colliderを作成します。
↑のように値を設定しました。
マウスカーソルと銃が重なったらマウスカーソルを非表示にする処理を追加
あとはマウスカーソルが銃のコライダと被ったかどうかを確認し非表示にする処理をCursorShotScriptに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | void Update () { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); transform.rotation = Quaternion.LookRotation(ray.direction); RaycastHit hit; if (Physics.Raycast (ray, out hit, 1f, LayerMask.GetMask ("Gun"))) { Cursor.visible = false; } else { Cursor.visible = true; } // マウスの左クリックで撃つ if(Input.GetButtonDown("Fire1")) { Shot(); } } |
メインのカメラからマウスの位置に1mだけレイを飛ばしGunレイヤーと接触した場合は
1 2 3 | Cursor.visible = false |
としてマウスカーソルを非表示にします。
Gunレイヤーと接触していない場合はマウスカーソルを表示しています。
これで処理が完成したので、Unityの実行ボタンを押して確認してみましょう。
上のように銃とマウスカーソルが被った場合はマウスカーソルが見えなくなりました。
これでUnityのアクションゲームで照準をマウス操作で動かす機能が完成しました。