メニューとカーソルを表示してプレイヤーの移動回転を止めるのスクリプトをもとに、TPSキャラクターを使っているときにメニューとカーソルを表示して、移動とカメラをロックしてみました。
TPSキャラクターを使うには、カメラと一緒にシーンに配置して、インスペクタでカメラにキャラクターをアタッチします。
TPSキャラクターにFPSキャラクターと同じインターフェースを継承させて、そのメソッドを実装します。継承できないときは、キャラクターやカメラで使うスクリプトを他のスクリプトと同じフォルダに移します。
public class ThirdPersonUserControl : MonoBehaviour, IPlayer
//...
[SerializeField] Cameras.FreeLookCam freeLookCam;
bool lockPosition;
public void LockPosition(bool locked)
{
lockPosition = locked;
}
public void LockRotation(bool locked)
{
freeLookCam.SetLockRotation(locked);
}
public void LockCursor(bool locked)
{
if (locked)
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
else
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
}
TPSコントローラーはキャラクターとカメラが別れているので、回転の制限のために、カメラのクラスに新しいメソッドを作って、それをキャラクターのクラスから呼んでいます。カーソルのロックはどこに書いても良さそうです。
移動回転を制限するときは、bool型のフィールドの値を切り替えて、キーやマウスの入力を受けるときに、それがtrueのときは0にして、falseのときはインプットを受け付けるようにしています。
float h;
float v;
bool crouch;
if (lockPosition)
{
h = 0f;
v = 0f;
crouch = false;
}
else {
h = CrossPlatformInputManager.GetAxis("Horizontal");
v = CrossPlatformInputManager.GetAxis("Vertical");
crouch = Input.GetKey(KeyCode.C);
}
また、カメラのクラスにカーソルの表示やロックを操作する記述があるのでコメントアウトしています。
これでTPSでもメニューとカーソルの表示と移動回転の制限ができました。
プレイヤーとカメラでインターフェースを分けてもいいと思いました。
public interface IPlayer
{
void LockPosition(bool locked);
}
public interface ICamera
{
void LockRotation(bool locked);
void LockCursor(bool locked);
}
abstract public class DisplayMenu : MonoBehaviour
{
[SerializeField] GameObject player;
[SerializeField] GameObject camera;
[SerializeField] Canvas[] canvases;
IPlayer playerScript;
ICamera cameraScript;
private void Awake()
{
playerScript = player.GetComponent<IPlayer>();
cameraScript = camera.GetComponent<ICamera>();
//...
public class FreeLookCam : PivotBasedCameraRig, ICamera
// ...
bool lockRotation;
public void LockRotation(bool locked)
{
lockRotation = locked;
}
public void LockCursor(bool locked)
{
if (locked)
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
else
{
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
}
これでメニュー表示のためにキャラクターにカメラをアタッチする必要がなくなりました。しかし、FPSキャラクターを使うときは二重にアタッチしています。