5月, 2012 のアーカイブ

Unityでは、AndroidとiPhone用の入力処理用の機能がありますが、触った箇所にあるゲームオブジェクトに処理を加える機能は自分で実装する必要があります。

 

今回は、Androidの実機でゲームオブジェクトをタッチした時、オブジェクトのOnMouseDown()メソッドを呼ぶ処理をメモります。OnMouseDown()を呼ぶのは、PCと同じ処理を使えるようにするためです。

 

では、さっそく実装に入ります。まず、スクリプトファイルを作成し、入力確認用のメソッドを実装します。ちなみに今回は、タッチだけを処理します。

 

public class TouchChecker : MonoBehaviour
{	
	protected virtual void CheckTouch()
	{
		if ( Input.touchCount <= 0 )
		{
			return;	
		}

 

最初のif分は、Androidを使用していない時や、入力が無い時の為のエラーチェックです。タッチの入力が一つも無い時は、入力確認の処理を飛ばします。

 

次に、タッチの入力があるかを確認します。

 

		Touch touch = Input.GetTouch(0);
		if ( touch.phase == TouchPhase.Began ) 
		{
 

 

今回は、タッチは一つだけ、それに画面に触ったフレームだけを確認に使用します。

 

次に、実際にオブジェクトを触ったかの確認する処理を実装します。今回、ゲームオブジェクトにタッチしているかを確認するのには、触った画面の位置からレイ(光線)を飛ばし、その光線に当たったオブジェクトのOnMouseDown()メソッドを呼び出します。

 

では、実際に実装します。まず、画面の触った位置を獲得し、その位置情報を使ってカメラから飛ばす光線を作ります。

 

                        Vector2 point = touch.position;
			RaycastHit hit = new RaycastHit();
			Ray ray = Camera.main.ScreenPointToRay( point );
			
			if ( Camera.main == null )
			{
				ray = Camera.current.ScreenPointToRay( point );
			}

 

最後のif文は、もしMainCameraが設定されていなかったり、存在しなかった時に、代わりに現在使用しているカメラを使う処理です(何かこれだけでも動く気もしますが、念の為です)。

 

次に実際に光線を飛ばします。光線は、UnityのPhysicsにある機能を使用し、それで当たったオブジェクトを獲得した後、そのオブジェクトのOnMouseDown()を呼んでいます。

 

			if ( Physics.Raycast( ray, out hit ) ) 
			{
				hit.transform.gameObject.SendMessage( "OnMouseDown" );
			}
   		}
	}

 

最後に、今実装したメソッドをUpdate()メソッド内で毎フレーム呼びます。

 

void Update () 
{
        CheckTouch();
}

 

後はこのスクリプトを適当なゲームオブジェクトに追加し、触った時に何らかの処理を実行したいゲームオブジェクトには、OnMouseDown()内で処理を追加してください。

 

今回はココまでです。
そういえば何時の間にか1万ヒット超えてました。ワーイ!
誰が見るかも解らないブログにココまでアクセスが来るとは・・・(と言ってもまだまだしょぼい数ですが)

最近Unityを使う事があるので、Unity嫌いにも関わらず、気が向いた時にUnity関連のメモを書くことにしました。

今回は、GUI TextにFPSを表示させるスクリプトについてメモります。ちなみに、Unityメモで書くコードは全てC#にする予定です (C# ラブ!)

GUITextのゲームオブジェクトを作る自体は簡単なので、スクリプトだけ解説します。

まず、必要な変数を宣言します。

public class FPSCounter : MonoBehaviour
{
public float m_updateInterval = 1.0f;  // 更新される頻度
float m_accumulated   = 0.0f;
float m_timeUntilNextInterval; //  次の更新までの残り時間
int m_numFrames = 0;

次に、Start()メソッド内で、FPSを更新させる頻度を初期化します。頻度は、エディター上から変更できます。

void Start()
{
m_timeUntilNextInterval = m_updateInterval;
}

次に、Update()メソッドで、FPSの更新処理を実装します。まずは、更新までの時間を経過した時間分減らし、フレーム数を加算します。

 void Update()
{
m_timeUntilNextInterval -= Time.deltaTime;
m_accumulated += Time.timeScale / Time.deltaTime;
++m_numFrames;

そして、更新までの時間が0を切ったら、FPSを更新します。この部分で、FPSの計算と、次の更新までの時間をリセットします。

if( m_timeUntilNextInterval <= 0.0 )
{
// FPSの計算と表示
float fps = m_accumulated / m_numFrames;
string format = System.String.Format( "FPS: {0:F2}", fps );
guiText.text = format;

m_timeUntilNextInterval = m_updateInterval;
m_accumulated = 0.0F;
m_numFrames = 0;
}
}

スクリプトは以上です。後は、GUI Textのゲームオブジェクトをシーン内に追加し、スクリプトを足してください。

 

実行結果は、以下の用になります: