「Unityゲーム開発 オンライン3Dアクションゲームの作り方」本で作ったゲームをOculus Rift対応にする - ReDo

2014年10月 9日

「Unityゲーム開発 オンライン3Dアクションゲームの作り方」本で作ったゲームをOculus Rift対応にする

unidra2.png
@izmさんの「Unity本いっぱい出てるので、お勧め本を難易度別に並べてみる」を参考に、「新しい・Oculus Rift対応できそうな3Dであること・C#」というのを条件に、表題の「Unityゲーム開発 オンライン3Dアクションゲームの作り方」という本を買いました。

本に沿って一通り3Dアクションゲームを作ってみて、それにOculus Riftのカメラまわりをえいやと足してみた話になります。

【本書について】
SB Creativeの本書のサポートページに正誤表があるので最初に見ておいた方がいいと思います。
・3400円+税ってなってますが2800円+税でした。セクシー衣装データがちょっと気になります。
・ダウンロードデータの中に「各章の最後の状態」のUnity Project一式があるので、途中でつまづいた際にも復旧可能です。親切。
・他の本やWeb上のコンテンツでUnityを触ったことがある人は最初の3章が不要な感じかもしれません。
・10章ぐらいまではさくさく行きますがその後はスクリプト入れ替え等で失敗するとプロジェクトが壊れてキャーという感じになります。ちなみにスクリプト更新についてはExplorerから上書きすればOKというのを覚えておいてください。そのままUnityにドラッグ&ドロップすると残念なことになります。

unidra3.png

【Oculus Rift DK2のカメラをくっつけてみた版】
とりあえずくっついた、というだけなのでいろいろ足りないのですが以下に置いておきます。
unidraocu_20141013.zip

・WASDかゲームパッド左スティックで移動できます。右クリックかButton2(XBOXコントローラだとBボタン)で殴ります。
・ゲームは突然始まって、死ぬか赤いドラゴンを倒すとクリアです。
・Oculus Riftに対応させる際にムリがあるだろうと思ったUnityGUI部をざっくりと省いているため、ネットワークには対応していません。

以下、Oculus Riftに対応時のメモ。

1. まずOculus Riftでマウス操作はアレなのでJoyStickに対応させます。PlayerCtrl.csに以下の様なコードを足すとスティック移動とBボタンでAttackができるようになります。

 :
	// ジョイスティックでの移動速度.
	public float joystickSpeed = 2.0f;
	// 現在のカメラ
	FollowCamera followcamera;
 :
	void Walking()
	{
		if (followcamera == null) {
			followcamera = FindObjectOfType<FollowCamera>();
		}
		// ジョイスティック入力を取得
		Vector3 joyStick = Vector3.zero;
		joyStick.x = Input.GetAxisRaw("Horizontal") * joystickSpeed;
		joyStick.z = Input.GetAxisRaw("Vertical") * joystickSpeed;
		if (joyStick.magnitude > 0) {
			Debug.Log ("joystick Hori=" + joyStick.x + " Ver=" + joyStick.z);
			// カメラの向きに合わせて移動方向を回転
			if (followcamera != null) {
				joyStick = Quaternion.Euler(0, followcamera.horizontalAngle, 0) * joyStick;
			}
			Vector3 position = transform.position;
			position.x += joyStick.x;
			position.z += joyStick.z;
			SendMessage("SetDestination", position);
			targetCursor.SetPosition(position);
		}
		// いいから剣を振る
		if (Input.GetButtonDown("Fire2")) {
			ChangeState(State.Attacking);
		}
 :

2. 次にHierarchyからMain Cameraを削除して、OVRCameraContollerを追加し、OVRCameraControllerに書籍データのFollowCamera.csとOculus Rift SDK側のOVRGamepadController.csをAdd Componentします。カメラからBGMが鳴るので、Audio SourceもAdd Componentしてbgm_game_fieldがLoopで鳴るようにします。

3. マウスのドラッグで回していたカメラがまわらないとたいそう不便なので、q/e/L1/R1で回るようにします。FollowCamera.csに以下の様なコードを足します。

 :
 	protected OVRCameraController 	CameraController = null;
	float yRotation = 0.0f;
        
	InputManager inputManager;
	void Start()
	{
		inputManager = FindObjectOfType<InputManager>();
                
		// We use OVRCameraController to set rotations to cameras, 
		// and to be influenced by rotation
		OVRCameraController[] CameraControllers;
		CameraControllers = gameObject.GetComponentsInChildren<OVRCameraController>();
		
		if(CameraControllers.Length == 0)
			Debug.LogWarning("OVRPlayerController: No OVRCameraController attached.");
		else if (CameraControllers.Length > 1)
			Debug.LogWarning("OVRPlayerController: More then 1 OVRCameraController attached.");
		else
			CameraController = CameraControllers[0];
	}
        
	void LateUpdate () {
		if (Input.GetKeyDown(KeyCode.Q) || (OVRGamepadController.GPC_GetButton((int)OVRGamepadController.Button.L1) == true)) {
			horizontalAngle += rotationAmount;
			UpdateAngle();
		}
		if (Input.GetKeyDown(KeyCode.E) || (OVRGamepadController.GPC_GetButton((int)OVRGamepadController.Button.R1) == true)) {
			horizontalAngle -= rotationAmount;
			UpdateAngle();
		}
 :
	void UpdateAngle() {
		float anglePerPixel = rotAngle / (float)Screen.width;
		Vector2 delta = inputManager.GetDeltaPosition();
		horizontalAngle += delta.x * anglePerPixel;
		horizontalAngle = Mathf.Repeat(horizontalAngle,360.0f);
		verticalAngle -= delta.y * anglePerPixel;
		verticalAngle = Mathf.Clamp(verticalAngle,-60.0f,60.0f);
	}

4. どうもOVRCameraControllerを足したせいなのか、「キャラ移動がバタつかないようにある程度近くなったらStopする」が効きすぎて移動できなくなってしまうため、CharacterMove.csのStoppingDistanceを下げておきます。

	// 目的地についたとみなす停止距離.
	const float StoppingDistance = 0.1f;

次はライフゲージあたりをパーティクルで作ってみようかなと思っています。

コメントする