「入力処理」タグのついた投稿

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万ヒット超えてました。ワーイ!
誰が見るかも解らないブログにココまでアクセスが来るとは・・・(と言ってもまだまだしょぼい数ですが)

今回は、前回紹介したのとは逆で、キーが話された時のみtrueを返すメソッドの実装方法をメモります。

実装方法は前回と同じで前のフレームと現在のフレームの入力状態を保存し、それらの状態を確認します。違う所は、確認方法が前回とは逆で、前のフレームでは入力があり、現在のフレームでは入力が無い状態でのみtrueを返すメソッドを実装します。

「こんなの何時使うんだー!」と思うかもしれませんが、あると便利なときもあります。一つの例としては、何かをドラッグ&ドロップするようなゲームを作る場合(World of Gooみたいな)、キーを離した瞬間に処理を行うことを簡単に出来るようになります。

実装は前回同様、前のフレームのキー状態と、現在のキー状態を保存する変数を宣言します。

KeyboardState m_KeyState;     // 現在の状態
KeyboardState m_prevKeyState; // 前のフレームの状態

またまた前回と同じで、Update()メソッドが呼ばれるたびにキーの状態を更新します。

m_prevKeyState = m_KeyState;
m_KeyState = Keyboard.GetState();

次に確認をするメソッドですが、上で説明したとおり、ここは前回と少し違います。

public bool IsReleased(Keys key)
{
return ( m_KeyState.IsKeyUp(key) && m_prevKeyState.IsKeyDown(key) );
}

後は、実際に使うだけです。

if ( IsReleased( Keys.Escape ) )
{
// ... 離された時の処理
}

以上です。

今回は、他のメモでよく出てきたキーの押された瞬間を獲得する(押されたフレームのみtrueを得る)方法をメモります。

実装方法は、一つ前のフレームでの入力状態を保存し、確認の際には前のフレームで任意のキーが押されておらず、現在のフレームで押されている場合はtrueを返すようにします。これにより、押されたフレームのみtrueを得ることが出来、一度キーを話さない限りfalseを返すメソッドを実装します。

実装するにはまず、前のフレームのキー状態と、現在のキー状態を保存する変数を宣言します。

KeyboardState m_KeyState;     // 現在の状態
KeyboardState m_prevKeyState; // 前のフレームの状態

次に、Update()メソッドが呼ばれるたびにキーの状態を更新します。

m_prevKeyState = m_KeyState;
m_KeyState = Keyboard.GetState();

入力を確認するメソッドを実装します。内用は上で説明したのと同じで、前のフレームでは押されておらず、現在のフレームでは押されている状態のみ、trueを返します。

public bool IsPressed(Keys key)
{
return (m_KeyState.IsKeyDown(key) && m_prevKeyState.IsKeyUp(key));
}

後は、実装したメソッドを呼ぶだけです。

if ( IsPressed( Keys.Escape ) )
{
   // ... 入力されたときの処理
}

以上です。