UnityUnityメモ

Unityでマウスカーソルの方向にオブジェクトを回転!簡単チュートリアル

Unity

はじめに

こんにちは!Unityでゲームを作るとき、マウスを使ってオブジェクトを操作できると、よりインタラクティブで楽しいゲームが作れますよね。例えば、アクションゲームでキャラクターがマウスカーソルの方向を向いたり、タワーディフェンスゲームで砲台が敵に向かって自動的に回転したりする動きは、よく見られる機能です。

今回の記事では、Unity初心者でも簡単にできる「マウスカーソルの方向にオブジェクトを回転させる方法」を解説します。これをマスターすれば、ゲームの演出や操作性がぐっと向上しますよ!

C#スクリプトを使った簡単な実装方法をステップバイステップで説明していくので、ぜひ一緒に挑戦してみてくださいね。この記事のゴールは、マウスカーソルに合わせて棒状のオブジェクトがリアルタイムに動く仕組みを作ることです。

それでは、早速始めましょう!

Unityを触ったことがないという方はコチラの記事から見てみてください!



1. オブジェクトの作成

Unityでマウスの動きに合わせて回転するオブジェクトを作るためには、まず「棒状のオブジェクト」を作成する必要があります。この手順では、3DのCylinder(円柱)を使ってオブジェクトを作ります。


ステップ1: Cylinderを作成する

  1. ヒエラルキーウィンドウを右クリックします。
  2. 表示されるメニューから「3D Object」→「Cylinder」を選択します。
    • すると、シーン内に円柱のオブジェクトが追加されます。
  3. 追加されたオブジェクトの名前を変更しましょう。今回は分かりやすいように「Stick」と名前を付けます。
    • 名前の変更は、ヒエラルキーウィンドウでオブジェクト名をダブルクリックするか、右クリックメニューから「Rename」を選びます。

ステップ2: 棒状に変形させる

デフォルトのCylinderは円柱状ですが、これを細長い棒のように見せるためにサイズを調整します。

  1. Cylinderを選択した状態で、インスペクターウィンドウを開きます。
  2. Transformコンポーネント内の「Scale」を次のように変更します:
    • X軸: 0.1
    • Y軸: 1
    • Z軸: 0.1
    • この設定で細長い棒状のオブジェクトが出来上がります。

ステップ3: オブジェクトの位置を調整する

シーン内でオブジェクトが適切に配置されるように位置を調整しましょう。

  1. Transformコンポーネントの「Position」を確認してください。
  2. 位置を (0, 0, 0) に設定しておくと、シーンの中心に配置されます。

ポイント

  • 棒状のオブジェクトを使うことで、マウスの動きが分かりやすく視覚的に表現できます。
  • Unityエディターでは、ScaleやPositionの調整が非常に重要です。数値を変更するたびにシーンビューで確認すると良いでしょう。

これでオブジェクトの作成は完了です!次は、空のオブジェクトを作成して、このCylinderを親子関係に設定するステップに進みましょう。



2. 空のオブジェクトを作成し親子関係を設定

次に、先ほど作成した棒状のオブジェクト(Cylinder)を、制御しやすくするために空のオブジェクトの子オブジェクトとして設定します。この手順は、複数のオブジェクトを管理したり、動かしたりするときに便利です。

1. 空のオブジェクトを作成する

  • ヒエラルキー(Hierarchy)ウィンドウで右クリックします。
  • Create Empty」を選択します。これで空のオブジェクトが作成されます。
  • 作成された空のオブジェクトは「GameObject」という名前で表示されます。この名前をわかりやすいように変更しましょう。
    • 例えば、「StickParent」など、今回の用途に合った名前に変更すると管理しやすくなります。

2. 空のオブジェクトの位置を調整する

  • 空のオブジェクトを選択した状態で、インスペクター(Inspector)ウィンドウを確認します。
  • 必要に応じて、PositionRotationScaleを画像のように調整します。

3. Cylinderを空のオブジェクトの子オブジェクトに設定する

  • ヒエラルキーウィンドウで、棒状に変形した「Cylinder」をドラッグ&ドロップします。
  • 「StickParent」など、先ほど作成した空のオブジェクトの上にドラッグします。
  • ドロップすると、Cylinderが空のオブジェクトの子オブジェクトになります。

4. 親子関係が設定されたか確認する

  • ヒエラルキーウィンドウで、「StickParent」の左側に小さな三角形のアイコンが表示されます。この三角形をクリックすると、子オブジェクトとして「Cylinder」がリスト表示されます。
  • この状態で、「StickParent」を動かしたり回転させたりすると、子オブジェクトである「Cylinder」も一緒に動くことが確認できます。

補足ポイント

親子関係を設定することで、次のようなメリットがあります:

  1. 簡単な管理: 空のオブジェクトを親にすることで、オブジェクト全体をまとめて制御できます。
  2. 拡張性: 子オブジェクトを増やしたり削除したりすることで、機能を柔軟に追加できます。

これで、親子関係の設定は完了です!次は、このオブジェクトをスクリプトで動かしてみましょう。



3. スクリプトの作成

ここでは、オブジェクトがマウスカーソルの方向を向くようにするスクリプトを作成します。Unityのエディター上で簡単に行える手順なので、一緒に進めていきましょう!


① 新しいスクリプトを作成

まず、スクリプトを作成します。以下の手順で進めてください。

  1. プロジェクトウィンドウ(画面下部か左下にあるウィンドウ)で、空白部分を右クリックします。
  2. メニューが表示されるので、「Create」→「C# Script」を選択します。
  3. 新しいスクリプトが作成されますので、名前を「StickRotate」と変更します。

② スクリプトを編集

次に、作成したスクリプトをダブルクリックして開きます(デフォルトではVisual StudioやRiderなどがエディターとして起動します)。以下のコードをスクリプトに貼り付けましょう。

using UnityEngine;

public class StickRotate : MonoBehaviour
{
    private Vector3 mouse;  // マウスの座標を取得する変数
    private Vector3 target; // カメラから見たマウス位置を変換した座標

    void Update()
    {
        // マウスカーソルのスクリーン座標を取得
        mouse = Input.mousePosition;

        // スクリーン座標をワールド座標に変換(カメラからの距離を10に設定)
        target = Camera.main.ScreenToWorldPoint(new Vector3(mouse.x, mouse.y, 10));

        // オブジェクトをターゲットの方向に向ける
        transform.LookAt(target);
    }
}

このスクリプトは、以下のように動作します:

  • Input.mousePosition でマウスの現在位置を取得します(スクリーン座標系)。
  • Camera.main.ScreenToWorldPoint を使い、スクリーン座標をワールド座標に変換します。この際、カメラからの距離(z値)を指定する必要があります。
  • transform.LookAt を使ってオブジェクトを指定したターゲットの方向に回転させます。

③ コードの内容を確認

コードを保存したら、一度確認してみましょう。

  • mousetarget のような変数を使って、マウスカーソルの位置情報を取得・変換しています。
  • Camera.main は、シーン内のメインカメラを指しています。このカメラが正しく設定されていないと、スクリプトが正常に動作しない可能性があるため注意してください。

④ エラーが出た場合の対処

スクリプトを貼り付けた後にエラーが出る場合、以下の点を確認してください:

  • スクリプト名が「StickRotate」と一致しているか。
  • コード内にタイプミスがないか。
  • Unityエディターでスクリプトを保存しているか。

次はこのスクリプトを空のオブジェクトにアタッチし、動作を確認するステップに進みましょう!



4. スクリプトのアタッチ

では、作成したスクリプト「StickRotate」をUnityに設定していきましょう!この手順では、スクリプトを空のオブジェクトにアタッチして動作可能にします。


ステップ1:スクリプトを空のオブジェクトにドラッグ&ドロップ

  1. ヒエラルキー(Hierarchy)ウィンドウで、空のオブジェクト(親オブジェクト)を選択してください。
    • まだ作成していない場合は、右クリックして「Create Empty」を選びましょう。
  2. プロジェクト(Project)ウィンドウから、作成した「StickRotate」スクリプトを選択します。
  3. 選択したスクリプトをドラッグし、空のオブジェクトにドロップします。
    • 正常にアタッチされると、インスペクター(Inspector)ウィンドウに「StickRotate (Script)」が表示されます。



5. 実行と調整

さて、準備が整ったら、いよいよ実行してみましょう!以下の手順でマウスの動きに合わせてオブジェクトが正しく回転するか確認していきます。


ステップ1: プレイモードで動作確認

  1. Unityエディターの上部にある「Play」ボタンをクリックしてプレイモードを開始します。
  2. シーンビューを確認しながら、マウスカーソルを画面内で動かしてみてください。
  3. オブジェクト(棒状のCylinder)がマウスの動きに合わせて回転しているかチェックしましょう。

ステップ2: カメラの位置や角度を調整

もし思った通りにオブジェクトが回転しない場合、カメラの位置や角度が原因かもしれません。以下を確認・調整してください。

  • カメラの位置:
    カメラがオブジェクトを正しく映していることを確認しましょう。シーンビューでカメラの位置を選択し、少し上や後ろに動かして再度確認してください。
    • 推奨カメラ位置:
      例)Position = (0, 5, -10)
      オブジェクト全体が画面に映るよう調整します。
  • カメラの角度:
    カメラがオブジェクトを正しく向いているか確認します。
    • 推奨角度:
      例)Rotation = (30, 0, 0)
      カメラがシーンを適切に見下ろすように調整しましょう。

これでプレイモードでの実行と調整が完了です!マウスカーソルの動きに応じてオブジェクトが回転するのを確認できましたか?うまく動作しない場合は、トラブルシューティングのセクションも参考にしてくださいね!



6. トラブルシューティング

Unityでオブジェクトをマウスカーソルの方向に回転させる設定をしていると、うまく動作しない場合があります。以下に、よくある問題とその解決方法をまとめました。


1. スクリプトが動作しない

原因と確認ポイント:

  • スクリプトが空のオブジェクトに正しくアタッチされているか確認しましょう。
  • スクリプト内にタイピングミスがないか確認してください(特に変数名やメソッドのスペルミスなど)。
  • Camera.mainが正しく取得されていない可能性があります。

解決方法:

  1. スクリプトをアタッチしたオブジェクトを確認します。
    • スクリプトを空のオブジェクトにドラッグ&ドロップしているかチェック。
  2. Unityコンソールでエラーが表示されていれば、その内容をよく読み、該当箇所を修正。
  3. Camera.mainが正しく取得されない場合は、カメラに「Main Camera」タグが設定されていることを確認してください。

2. オブジェクトが回転しない

原因と確認ポイント:

  • カメラの位置や角度が適切でない可能性があります。
  • スクリプト内のScreenToWorldPointで指定するz値が不適切な可能性があります。

解決方法:

  1. シーン内のカメラの位置を確認し、オブジェクトから一定の距離が取られているか確認。
    • カメラがオブジェクトと同じ位置にある場合、マウスの位置が正確に反映されません。
  2. Camera.main.ScreenToWorldPoint(new Vector3(mouse.x, mouse.y, 10))のz値を変更して試してみましょう。
    • z値は、カメラから対象オブジェクトまでの距離を意味します。例えば、10を20に変えてみることで、挙動が改善する場合があります。



3. マウスの動きが反映されない

原因と確認ポイント:

  • マウスの座標が正しく取得されていない可能性があります。
  • スクリプト内でInput.mousePositionの値が更新されているか確認してください。

解決方法:

  1. UnityコンソールにDebug.Log(mouse);を追加し、マウス座標が取得されているか確認します。csharpコードをコピーするDebug.Log(mouse);このログが出力されていない場合、コードが正しく実行されていない可能性があります。
  2. マウスの動作が遅い、または滑らかでない場合は、スクリプトのUpdate()メソッドに問題がある可能性があります。FixedUpdate()ではなく、必ずUpdate()内で処理を行いましょう。

4. Unityコンソールにエラーが表示される

原因と確認ポイント:

  • Unityコンソールに「NullReferenceException」や「ArgumentException」などのエラーが表示される場合があります。

解決方法:

  1. コンソールに表示されるエラーメッセージを確認し、該当するコード行を特定します。
    • NullReferenceExceptionの場合:参照が正しく設定されていない可能性があります。カメラやターゲットの設定を確認しましょう。
    • ArgumentExceptionの場合:ScreenToWorldPointの引数が不適切な可能性があります。
  2. 修正後、必ずシーンを保存して再実行してみてください。

5. カメラの設定が不適切

原因と確認ポイント:

  • カメラが正しい方向を向いていない場合、オブジェクトが期待通りに回転しません。

解決方法:

  1. シーン内のカメラの位置と角度を確認し、オブジェクト全体が映るように調整します。
  2. カメラのプロジェクションモード(OrthographicやPerspective)を確認し、用途に合ったモードを選択します。
    • 通常はPerspectiveモードを使用するのがおすすめです。

これらの手順を試すことで、スクリプトやカメラ設定に関連する問題を解決できます。動作確認を行いながら、一つずつ原因を特定して修正しましょう。それでも解決しない場合は、Unityフォーラムや公式ドキュメントを参考にすることをおすすめします!



よくある質問

Q
スクリプトを入力したけどエラーが出ます。どうすればいいですか?
A

スクリプトを保存後、Unityエディターで再読み込みを試してください。エラー内容を確認し、タイピングミスがないか見直しましょう。

Q
オブジェクトが回転しません。原因は何ですか?
A

カメラの位置や角度が正しく設定されているか確認してください。Camera.main.ScreenToWorldPointのz値が0だと動作しないことがあります。

Q
マウスカーソルを動かしても反応しません。どうすればいいですか?
A

シーン内にカメラがあることを確認し、スクリプトでCamera.mainが正しく取得されているかをチェックしてください。

おすすめのアセット

Squad Shooter Template Editorは、Unityでシューティングゲームを簡単に作れるテンプレートです。このアセットを使えば、チームベースのシューティングゲームを短時間で作成できます。キャラクターや武器、敵のAIなど、必要な要素がすべて揃っています。