Tobii Eye Trackerでシューティング
シューティング
前回はTobii Unity SDK for Desktopを利用して, オブジェクトの注視状態を取得する方法を説明しました. 今回はスクリーン上の 注視座標 を取得することを目指します. また,この注視座標を利用して,簡単なシューティング・ゲームを制作してみたいと思います.
プロジェクトの作成
Unityでプロジェクトを新規作成します. テンプレートは 2D , プロジェクト名は TobiiShooting に設定します. また,Tobii Unity SDK for Desktopをプロジェクトに導入してください.
アセットの導入とオブジェクトの配置
シューティングに必要なアセットを導入します. Asset Store から Fighter Interceptor をダウンロードします(無料). このファイターの3Dモデルを自機とします.
また,背景色は黒にするため,Main Camera の背景(Background)は, 黒(#000000)に設定しておきます.
次に,シーンに下記のオブジェクトを配置します.
- 方向性ライト(Directional Light)
- 導入したFighter Intercepterの Fighter オブジェクト
Fighterオブジェクトの,位置(Position),回転(Rotation),スケール(Scale)は下図のように設定します.
ここまでで,ゲーム画面を確認すると下記のようになります.
ミサイルのプレハブの実装
次に,自機が発射するミサイルを実装します. ミサイルは Sphere で表すことにします. シーンに追加したら Missile にリネームしてください. 位置(Position),回転(Rotation),スケール(Scale)は下図のように設定します.
また,マテリアルを Yellow に変更しておきます.
ここまでで,実機の先頭にミサイルが表示されます.
次に,ミサイルの動きを表現するスクリプトを作成します. ここでは,Add Component から New Script を選択し, MissileHandler というファイル名でスクリプトを作成します.
ターゲット(target) を設定し,自機との 角度(angle) を求めます. この角度を進行方向とし,一定の速度でミサイルは移動します.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MissileHandler : MonoBehaviour
{
public Vector2 target = new Vector2(0, 1); //ターゲット
public Vector2 speed = new Vector2(0.03f, 0.03f); //ミサイルの速度
private float angle; //ミサイルの角度
private Vector2 position; //自機の位置
void Start()
{
//発射する角度
angle = Mathf.Atan2(target.y - transform.position.y,
target.x - transform.position.x);
}
void Update()
{
position = transform.position;
position.x += speed.x * Mathf.Cos(angle);
position.y += speed.y * Mathf.Sin(angle);
transform.position = position;
}
}
ここでは, target = (0,1) となっているため,自機の上方向に向かってミサイルは発射されます.
作成したミサイル(Missile)・オブジェクトを プレハブ にします. プレハブにすることで,ソースコードからオブジェクトのインスタンスを作成することが出来るようになります. Assets フォルダに,Resources フォルダを作成し,ここにミサイル・オブジェクトをドラッグ&ドロップします.
ミサイルの発射の実装
それでは,自機からミサイルを発射するスクリプトを作成します. Add Component から New Script を選択し,FlishtHandler というファイル名でスクリプトを作成します. プレハブ化したミサイルのインスタンスを作成するには, Instantiate メソッドを利用します. ここでは,30回の更新(Update)に1回の割合で,ミサイルのインスタンスを生成しています,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FighterHandler : MonoBehaviour
{
public GameObject missile;
private int counter = 0;
private int interval = 30;
void Start()
{
//リソースからMissleをロード
missile = (GameObject)Resources.Load("Missile");
}
void Update()
{
if(counter == 0)
{
Instantiate(missile);
}
counter = (counter + 1) % interval;
}
}
注視座標を取得するため,Tobii.Gaming のライブラリを導入します. ソースコードの先頭に using Tobii.Gaming を追記します. ユーザが注視している座標は TobiiAPI.GetGazePoint() で取得することができます. この注視座標をターゲット(target)として,ミサイルを発射します.
void Update()
{
//注視座標を取得
GazePoint gazePoint = TobiiAPI.GetGazePoint();
if(counter == 0)
{
GameObject obj = Instantiate(missile);
MissileHandler mh = obj.GetComponent<MissileHandler>();
//スクリーン座標からワールド座標へ
Vector2 pos = Camera.main.ScreenToWorldPoint(new Vector2(gazePoint.Screen.x, gazePoint.Screen.y));
//ターゲットの設定
mh.target = pos;
}
counter = (counter + 1) % interval;
}
ゲームを実行すると,注視した方向にミサイルが発射されることが確認できます. このように,注視座標を利用したゲームやアプリの開発が可能です.