はじめに
皆様こんにちは。個人でゲーム制作をしております、kenと申します。
この講座では、実際にゲームを作りながら「こういう事をするなら、こういう風にすると良いと思うよ。詳しくは自分で調べてね。」という感じで、ゲームの作り方、Unityの機能やアセット等を軽く紹介して行きます。
今回は、カメラをオブジェクトに追従させる方法をいくつか紹介します。
StandardAssetsを使う
多分これが1番簡単だと思います。
StandardAssetsに簡単なカメラのスクリプトがあるので、アセットストアからStandardAssetsをインポートして、それを使いましょう。
使い方は調べなくても見れば分かるくらい簡単ですが、一応使い方を解説している記事を貼っておきます。
Unityでカメラの設定とキャラクターの追従をさせる
Cinemachineを使う
Cinemachineを使うと高機能なカメラがノンコーディングで作れちゃいます。めちゃくちゃ多機能で、3Dも2Dもあらゆるタイプのカメラが作れます。
どんな事ができるの?
まずは、どんな事が出来るのか、公式のサンプルの中からゲームでよく使いそうなものを紹介します。
ちなみに、このサンプルで使われているキャラ移動のスクリプトですが、キー入力の判定がFixedUpdate内に書かれているので、ジャンプキーの反応が悪いです。part2でも言いましたが、キーの入力判定をFixedUpdate内に書かないようにしましょう。
2DConfiner
2Dでキャラをスムーズに追従しつつ、壁の向こう側を移さないようにするカメラです。
2DTargetGroup
2Dで複数の対象がカメラに収まるようにズームするカメラです。
Free Look character
Free Look collider
Noise
StateDrivenCamera
走っている間だけカメラをゆれるカメラに切り替えるサンプルです。もう少し詳しく説明すると、Cinemachineには仮想カメラというものを複数用意し、それらをスムーズに切り替えられる機能があるので、キャラクターの状態ごとに別のカメラに切り替えるサンプルですね。三人称視点と一人称視点の切り替えなんかにも応用できそうです。
他にもいろんなことが出来ますし、カメラの挙動はかなり細かく設定することが出来ます。
使い方
Cinemachineの基本的な使い方は以下の記事が分かりやすいです。
【Unity】Cinemachine入門!スクリプトなしでカッコいいカメラワークを作る
サンプルの種類がめちゃくちゃ豊富なので、Cinemachineを詳しく知りたい方は、自分でサンプルをインポートして動かしてみるのがオススメです。
オブジェクトを動かしてみよう!
『実際にゲームを作りながら紹介していく』と言いながら、いまだに何も作ってませんでしたが、そろそろ動くものを作りたいと思います。
今まで紹介して来た機能の中から以下の機能を使ってカプセルを動かしてみます。
・移動/NavMesh
・入力の取得/新しいInputSystem
・カメラ/Cinemachine
NavMeshの設定
まずは、適当に作ったTerrainにNavMeshをBake
適当にカプセルを置いてNavMeshAgentをアタッチ(設定はデフォルトのまま)
InputSystemの設定
InputSystemのサンプルに付いているSimpleControlsをそのまま使います。
Cinemachineの設定
仮想カメラを作成。
メインのカメラにCinemachineBrainをアタッチします。Priorityの高い仮想カメラが自動で選択されるので、特に何も設定しなくても使えます。
スクリプト
移動する方向を受け取って移動させるクラスと、入力の方向とカメラの向きから移動する方向を算出して移動させるクラスに渡すクラスに分離しました。これをカプセルにアタッチします。
usingUnityEngine;publicinterfaceIMoveComponent{voidMove(Vector3velocity);}usingUnityEngine;usingUnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))]publicclassMoveAgent:MonoBehaviour,IMoveComponent{[SerializeField]float_speed=3f;NavMeshAgent_agent;voidStart(){_agent=GetComponent<NavMeshAgent>();}publicvoidMove(Vector3velocity){_agent.Move(velocity*_speed);}}usingUnityEngine;[RequireComponent(typeof(IMoveComponent))]publicclassPlayerController:MonoBehaviour{Camera_mainCamera;SimpleControls_controls;IMoveComponent_moveComponent;voidAwake(){_controls=newSimpleControls();}voidStart(){_mainCamera=Camera.main;_moveComponent=GetComponent<IMoveComponent>();}voidOnEnable(){_controls.Enable();}voidOnDisable(){_controls.Disable();}voidOnDestroy(){_controls.Dispose();}voidUpdate(){varinputVector=_controls.gameplay.move.ReadValue<Vector2>();varcameraVector=_mainCamera.transform.forward;varvelocity=Quaternion.LookRotation(cameraVector,Vector3.up)*newVector3(inputVector.x,0,inputVector.y);velocity*=Time.deltaTime;_moveComponent.Move(velocity);}}完成品
まとめ
やっとオブジェクトを動かせるようになりましたが、カプセルを動かしても面白く無いですね。
という訳で次回は、キャラクターのセットアップの仕方を紹介します。
次回⇨4/5(日)投稿予定(他に書きたい記事があるので2週間お休みします)











