Unityのアクションゲームで照準をマウス操作で動かす

今回はマウス操作で動く照準を作成し、敵を倒す機能を作成していきます。

敵をマウスクリックで倒すゲームを作成する時、マウスに追従する照準のUIを作成しマウスポインタを非表示にするかまたはマウスポインタ自体を照準のテクスチャにしてしまう方法があります。

今回はマウスポインタ自体を照準のテクスチャに変更し、敵をマウスで押した時に消すようにしてみます。

銃と手の一部を表示したFPS(FirstPersonShooter)でも応用は利きますが、
マウスポインタ自体を照準のテクスチャにする場合照準が一番手前に表示されてしまう為、銃や手の上に照準が表示されてしまいます。

それの対処は後でやってみます。

スポンサーリンク

照準画像を用意してUnityに取り込み、設定を行う

まずは照準の画像をUnityに取り込んでみます。
ご自分で照準の画像を用意して頂くか、わたくしが作った照準を使ってください。

照準

Unityのメニュー→Assets→Import New Assetで画像を選択するか
画像をUnityのAssetsメニューにドラッグ&ドロップします。

照準1

取り込んだらTexture TypeをCursorに変更し、Max Sizeを32に変更します。(わたくしの画像を使う場合)

マウスカーソルの変更と攻撃処理のTestTargetスクリプトの作成

次にヒエラルキーで右クリック→Create Emptyでゲームオブジェクトを作り名前をScriptとします。
このScriptにカーソルを変更するスクリプトTestTargetを作り取りつけます。

Start関数内でCursor.SetCursorを使い自前のテクスチャをカーソルに設定します。
第2引数にはテクスチャの左上からのオフセット値を指定します。

カーソルの中心を画像の真ん中にする為に画像の横幅と縦幅の半分を第2引数に指定します。
これで照準の真ん中がカーソルの真ん中となります。

マウスの左ボタンを押した時に敵と当たっているか判定するShot関数を呼び出します。

Camera.main.ScreenPointToRay(Input.mousePosition)

でメインのカメラからレイ(線)をマウスの位置に飛ばします。

Physics.RaycastでEnemyレイヤーに設定されているゲームオブジェクトコライダと接触した場合にそのコライダのゲームオブジェクトを消去しています。

敵キャラクターにコライダを設定し、マウスを押して消えるか確認

それではスクリプトの作成が終わったので、敵キャラクターを設置し、敵キャラクターにコライダを設定してください。
また敵キャラクターのレイヤーをEnemyに設定します。(レイヤーがない場合は作成してください)

照準2

上の画像のようになりました。

またTestTargetのインスペクタのcursorにさきほど取り込んだ照準を設定します。

それではUnityの実行ボタンを押して確認してみます。

照準3

上の動画のようにマウスカーソルの変更とマウスで敵を倒す事が出来るようになりました。

少しだけFPS風に銃を配置してみる

では少しFPS風に銃を登場させてみます。

まずは銃をAsset Storeで探します。
検索でAssault Rifle A3を探し、インポートします。

照準4

上のように銃のサイズ、位置を変更し表示します。

銃の向きをマウスカーソルの方向へ向かせるRotateGunスクリプトの作成

銃はマウスカーソルの位置の方向を向かせたいので新しくRotateGunスクリプトを作り取りつけます。

メインのカメラからマウスの位置にレイを飛ばしray.directionでレイの方向を取得します。
Quaternion.LookRotationで方向の角度が取得出来るので、その角度を銃の角度に設定します。

これで銃がマウスカーソルの方向を向くようになります。

マウスカーソルが銃の手前に表示されてしまう問題

それでは銃の処理も出来たので確認してみます。

照準5

照準が銃の手前に表示されてしまっています。

これは照準がマウスカーソルという事を思い出すとわかりますが、マウスカーソルなのでどんなゲームオブジェクトより手前に表示されます。

銃とマウスカーソルが被ったらマウスカーソルを非表示にする

これでは困るので、銃にコライダを設定し、マウスカーソルが銃のコライダと被った場合は非表示にするようにします。
銃にコライダを追加します。

照準6

上のように大雑把ではありますがBox Colliderを作成します。

照準7

銃のゲームオブジェクトのScaleが0.01なのでコライダのサイズ指定でも大きい数字になっています。

マウスカーソルと銃が重なったらマウスカーソルを非表示にする処理を追加

あとはマウスカーソルが銃のコライダと被ったかどうかを確認し非表示にする処理をTestTargetに追加します。
以下が処理を追加したTestTargetスクリプトです。

メインのカメラからマウスの位置に1mだけレイを飛ばしGunレイヤーと接触した場合は

Cursor.visible = false

としてマウスカーソルを非表示にします。

Gunレイヤーと接触していない場合はマウスカーソルを表示しています。

これで処理が完成したので、Unityの実行ボタンを押して確認してみましょう。

照準8

上のように銃とマウスカーソルが被った場合はマウスカーソルが見えなくなりました。
これでUnityのアクションゲームで照準をマウス操作で動かす機能が完成しました。

コメント

  1. ぱんさー より:

    私の環境だと銃がきれいに表示されないです
    なにか設定があれば教えて頂きたく
    宜しくお願い致します。

    深度やclear FlagsをDepth onlyなどは試してみました。。。

    • えーと、この記事の状態と同じで(管理人自身がどこでどういう設定をしているか忘れています)
      カメラはMain Camera1つでそれが全体を表示していて、そのカメラに銃が綺麗に表示されればいいんですよね?
      銃自体にレイヤーをGunと設定していた場合はMain CameraのコンポーネントのCameraのCulling MaskでGunにチェックが入っている事を確認してください。

      この記事ではMain Cameraが上のような設定で銃は記事中の銃のTransformの画像を参考にしてください。
      これで記事の内容と同じ位置に表示出来ます。
      Main Cameraを別の位置に指定している場合はSceneタブを選択して、

      カメラの位置に合わせて銃の位置調整(オブジェクトをドラッグまたは銃のインスペクタの値を調整)する事で銃の位置を調整出来ます。
      Scene画面とGame画面を同時に表示させて確認するとやりやすいと思います。

      ↑のような内容ではなくカメラの前に銃があるのに銃が表示されていないということならばコンポーネントのCameraのCulling Maskで銃の
      レイヤーがチェックされていないのかもしれません。

      質問を頂くと記事内容の不備が発見出来ますね・・・(^_^;)

  2. ぱんさ~ より:

    返信ありがとうございます。

    試してみましたが、無理でした。。。
    おそらく銃自体が自キャラかカメラに近い?ためかもしれないと思っています。
    (銃が途中からしか表示されない状態。。)

    またいくつか試してみたいと思っています。
    ありがとうございました。

    • 銃が途中からしか表示されないという事はCameraのClipping PlanesのNearの値を小さくする事で手前側も表示出来る可能性もあります。
      お力になれず申し訳ありません(__)

  3. ぱんさ~ より:

    CameraのClipping PlanesのNearの値を小さくすると行けました!!

    ありがとうございました。
    取り急ぎお礼まで。

  4. ぷちお。 より:

    c#ではどのような命令をすればよいでしょうか?

    • JavaScript、C#の読み換えに関しては

      http://gametukurikata.com/program/javascriptcsharp

      ↑の記事で解説しているので参照してください。

      ファイル名をTestTargetとしたらクラス名をTestTargetにします。
      またMonobehaviourクラスを継承して作成しておきます。

      変数の宣言方法を変え、関数のfunctionとしている所をアクセス修飾子、戻り値の指定に変えてメソッドに変更します(上の例ではアクセス修飾子の指定はしてません)。
      Cursor.SetCorsorの引数でVector2だけで使っているところをちゃんとnew Vector2でオブジェクトを生成します。

      また、Physic.Raycastの引数でhitを指定している箇所の前に『out』が必要になります。
      C#だとこのoutがないとエラーになりますね。

      動作確認してみましたが問題ないようです。