Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9743

【中級者向けUnity講座】RPG編 part4『キャラにカメラを追従させる』

$
0
0

はじめに

皆様こんにちは。個人でゲーム制作をしております、kenと申します。
この講座では、実際にゲームを作りながら「こういう事をするなら、こういう風にすると良いと思うよ。詳しくは自分で調べてね。」という感じで、ゲームの作り方、Unityの機能やアセット等を軽く紹介して行きます。

今回は、カメラをオブジェクトに追従させる方法をいくつか紹介します。

StandardAssetsを使う

多分これが1番簡単だと思います。
StandardAssetsに簡単なカメラのスクリプトがあるので、アセットストアからStandardAssetsをインポートして、それを使いましょう。

使い方は調べなくても見れば分かるくらい簡単ですが、一応使い方を解説している記事を貼っておきます。
Unityでカメラの設定とキャラクターの追従をさせる

Cinemachineを使う

Cinemachineを使うと高機能なカメラがノンコーディングで作れちゃいます。めちゃくちゃ多機能で、3Dも2Dもあらゆるタイプのカメラが作れます。

どんな事ができるの?

まずは、どんな事が出来るのか、公式のサンプルの中からゲームでよく使いそうなものを紹介します。

ちなみに、このサンプルで使われているキャラ移動のスクリプトですが、キー入力の判定がFixedUpdate内に書かれているので、ジャンプキーの反応が悪いです。part2でも言いましたが、キーの入力判定をFixedUpdate内に書かないようにしましょう。

2DConfiner

2Dでキャラをスムーズに追従しつつ、壁の向こう側を移さないようにするカメラです。
01af8644-f179-4c93-8d38-cb04a28653c6.gif

2DTargetGroup

2Dで複数の対象がカメラに収まるようにズームするカメラです。
3f58071b-d488-45d0-8065-64bd547cc7ed.gif

Free Look character

よくある3Dの三人称カメラです。
95c131bb-f648-40da-afe3-6814dc313e2a.gif

Free Look collider

壁を貫通しない3D三人称カメラです。
36f8ffd2-d052-4871-9627-7eb5f98f3149.gif

Noise

ランダムで揺れるカメラです。
1d7e34b9-3345-4c37-9bc9-b387b3212107.gif

StateDrivenCamera

走っている間だけカメラをゆれるカメラに切り替えるサンプルです。もう少し詳しく説明すると、Cinemachineには仮想カメラというものを複数用意し、それらをスムーズに切り替えられる機能があるので、キャラクターの状態ごとに別のカメラに切り替えるサンプルですね。三人称視点と一人称視点の切り替えなんかにも応用できそうです。
7371a813-2a37-4f15-b870-dff4a939fda6.gif

他にもいろんなことが出来ますし、カメラの挙動はかなり細かく設定することが出来ます。

使い方

Cinemachineの基本的な使い方は以下の記事が分かりやすいです。
【Unity】Cinemachine入門!スクリプトなしでカッコいいカメラワークを作る

サンプルの種類がめちゃくちゃ豊富なので、Cinemachineを詳しく知りたい方は、自分でサンプルをインポートして動かしてみるのがオススメです。

オブジェクトを動かしてみよう!

『実際にゲームを作りながら紹介していく』と言いながら、いまだに何も作ってませんでしたが、そろそろ動くものを作りたいと思います。

今まで紹介して来た機能の中から以下の機能を使ってカプセルを動かしてみます。
・移動/NavMesh
・入力の取得/新しいInputSystem
・カメラ/Cinemachine

NavMeshの設定

まずは、適当に作ったTerrainにNavMeshをBake
image.png
適当にカプセルを置いてNavMeshAgentをアタッチ(設定はデフォルトのまま)
image.png

InputSystemの設定

InputSystemのサンプルに付いているSimpleControlsをそのまま使います。
image.png

Cinemachineの設定

仮想カメラを作成。
image.png
メインのカメラにCinemachineBrainをアタッチします。Priorityの高い仮想カメラが自動で選択されるので、特に何も設定しなくても使えます。
image.png

スクリプト

移動する方向を受け取って移動させるクラスと、入力の方向とカメラの向きから移動する方向を算出して移動させるクラスに渡すクラスに分離しました。これをカプセルにアタッチします。

IMoveComponent.cs
usingUnityEngine;publicinterfaceIMoveComponent{voidMove(Vector3velocity);}
MoveAgent.cs
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);}}
PlayerController.cs
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);}}

完成品

動いた!
0a1e11e5-fb65-405c-831e-5a048693971b.gif

まとめ

やっとオブジェクトを動かせるようになりましたが、カプセルを動かしても面白く無いですね。

という訳で次回は、キャラクターのセットアップの仕方を紹介します。
次回⇨4/5(日)投稿予定(他に書きたい記事があるので2週間お休みします)


Viewing all articles
Browse latest Browse all 9743

Trending Articles