LotosLabo

プログラミング技術とか気になった情報を載せていきます

【興奮注意】Oculusでおじさま達に見つめられてみた

f:id:lo25131:20141104220635j:plain


HeadLookControllerというAssetを使って、相手から見つめられるようにしてみました。

https://www.assetstore.unity3d.com/jp/#!/content/4


f:id:lo25131:20141104221152j:plain


写真に見える黄色の玉をグリグリ動かすことで、拳銃持った人相の悪いおっさんの頭の向きが追随してきます。

これをとりあえず他のキャラクターで試してみてはどうかということで、
はしもとさんの記事を参考に試してみました。



私は、Mecanim Locomotion Starter Kitのおじさまで試してみました。

https://www.assetstore.unity3d.com/jp/#!/content/7673

f:id:lo25131:20141104221735j:plain


HeadLookControllerの値は参考にしましたが指定した場所は適当です。

f:id:lo25131:20141104222010j:plain

首と頭と、腰とお尻かな



スクリプトの方は、HeadLoockController.csはいじらず、CursorHit.csのみいじりました。

using UnityEngine;
using System.Collections;

public class CursorHit : MonoBehaviour {

	private GameObject avatar;
	private HeadLookController headLook;

	private float offset = 1.5f;

	
	void Start()
	{
                // "DefaultAvatar"というオブジェクトを取得
		avatar = GameObject.Find( "DefaultAvatar" );
	}
	
	void LateUpdate () 
	{

		if (Input.GetKey(KeyCode.UpArrow))
			offset += Time.deltaTime;
		if (Input.GetKey(KeyCode.DownArrow))
			offset -= Time.deltaTime;	
		
        // avatarオブジェクトのHeadLookControllerスクリプトを取得
		headLook = avatar.GetComponent<HeadLookController>();
		headLook.target = transform.position;
		
		
		
	}
}

考え方としてはこのCursorHitでavatorの位置を取得して、HeadLookControllerに渡していると考えると分かりやすいです。
Raycastの部分はいらないので、名前はCursorHitじゃないほうがいいかもしれません。


こんな感じで追随されたかと思います。



え、何? 1人じゃ満足出来ないって?

奥さん欲張りすぎですよー



じゃあこのheadLookを複数指定してやるだけでいいのです。


考えとしてはこんな感じです。


私が改変する前の初期のプログラムでは
public HeadLookController headLook;

void LateUpdate()
{
headLook.target = transform.position;
}

HeadLookControllerスクリプトの付いているオブジェクトをドラッグ&ドロップしていたかと思います。


それだと、

public HeadLookController headLook1;
public HeadLookController headLook2;
public HeadLookController headLook3;
               ・
        ・
        ・
void LateUpdate()
{
headLook1.target = transform.position;
headLook2.target = transform.position;
headLook3.target = transform.position;
               ・
        ・
        ・
}

これをその人数分用意すればいいことです。
これでも一応動きますが、見た目的に汚いです。
なのでこれを短くしちゃいましょう。

そういうことなので、考え方としては

Avatarオブジェクトすべてをavatarとして認識。
②それを順番に配列(複数の値が入る変数)に入れていく。
③その配列を取り出して、targetの値をスクリプトのHead Look Controllerに渡す

という流れです。


CursorHitを書き直すとこんな感じになります。

using UnityEngine;
using System.Collections;

public class CursorHit : MonoBehaviour {
	
        // 配列として宣言
	private GameObject[] avatar;
	private HeadLookController headLook;

	private float offset = 1.5f;

	void Start()
	{
                // "avatar"と付いたタグのオブジェクトを配列に格納する
		avatar = GameObject.FindGameObjectsWithTag( "avatar" );
	}

	void LateUpdate () 
	{

		if (Input.GetKey(KeyCode.UpArrow))
			offset += Time.deltaTime;
		if (Input.GetKey(KeyCode.DownArrow))
			offset -= Time.deltaTime;

		//配列から取り出す
		foreach( GameObject obj in avatar )
		{
			headLook = obj.GetComponent<HeadLookController>();
			headLook.target = transform.position;
		}	
	}
}


これで"avatar"タグと付いているキャラクターはすべて私を見つめるようになったと思います。
ちなみにタグではなくて、avatar1、avatar2という名前から認識させたい場合は

private GameObject avatar;
void LateUpdate(){

for ( int i=1; i<6; i++ )
{
avatar = GameObject.Find( "avatar" + i );
headLook = avatar.GetComponent<HeadLookController>();
headLook.target = transform.position;
}

}

5つのavatarを連番で指定させたい場合はfor文で回してあげればいいと思います。


これで動作は確認してますが、もっと効率のいい方法や正確な方法があるかもしれません。私の方法が絶対とは限りませんので、こんな感じのほうがいいよというのがありましたらよろしくお願いします。



そして最後です。これをOculusに対応させましょう。

ただOVRPlayerControllerのOVRCameraRigにくっつければ完成です。




これでおじさま達にただ見つめられるだけのコンテンツが出来ました!




ちょっとわかりにくいですよね。