子ノ刻ラボラトリィ

子ノ刻[23:00-01:00]に右脳系ディベロッパが時々お送りするAndroidアプリ開発日誌。主にUnity。最近LINEスタンプ。時々雑記。

タッチ(クリック)したGameObjectの取得とキャラクターを吹っ飛ばしてみた

こんばんは! しんがです。

今回は、タッチしたGameObject(敵キャラクター)を取得し、そのGameObjectに力を加えて吹っ飛ばしてみました。

タッチの取得 (Physics.Raycast)

TouchManagerを作成し、タッチ(またはクリック)したGameObjectを取得します。

以下のサイトを参考にさせて頂き、C#で記述しました。

マウスカーソルでオブジェクトを選択 - 強火で進め


using UnityEngine;
using System.Collections;

public class TouchManager : MonoBehaviour
{
	// 自身のインスタンス
	private static TouchManager instance = null;
	// Rayを飛ばすカメラ
	private Camera myCamera;
	// Ray
	private Ray ray;
	// Rayがヒットしたものの情報 
	private RaycastHit hit;
	
	// RayがヒットしたGameObjectを格納
	public static GameObject selectedGameObject;
	
	void Awake ()
	{
		// TouchManagerの唯一のインスタンスを生成
		if (instance == null) {
			instance = this;
		} else {
			Destroy (gameObject);
		}
	}
	
	// Use this for initialization
	void Start ()
	{
		myCamera = Camera.main;
	}
	
	// Update is called once per frame
	void Update ()
	{
	#if UNITY_EDITOR
		// UnityEditorの時のみ(クリック)
		if(Input.GetMouseButtonDown(0)){
			Debug.Log("Clicked");
			Vector3 clickDeltaPosition = Input.mousePosition;
			ray = myCamera.ScreenPointToRay(clickDeltaPosition);
						
			if(Physics.Raycast(ray, out hit)){
				// RayがヒットしたGameObjectをstaticなクラス変数に格納
				selectedGameObject = hit.collider.gameObject;
			}if(Input.GetMouseButtonUp(0)){
				selectedGameObject = null;
			}
			Debug.Log("hit" + hit);
		}
#elif UNITY_ANDROID
		// タッチされている
		if (Input.touchCount == 1) {
			Debug.Log ("touch");
			
			Touch t = Input.touches [0];
			
			// タッチの位置からRayを発射
			ray = myCamera.ScreenPointToRay (Input.touches [0].position);
			
			if (t.phase == TouchPhase.Ended && Physics.Raycast (ray.origin, ray.direction, out hit, Mathf.Infinity)) {
				// RayがヒットしたGameObjectをstaticなクラス変数に格納
				selectedGameObject = hit.collider.gameObject;	
			} else if (t.phase == TouchPhase.Ended && !Physics.Raycast (ray.origin, ray.direction, out hit, Mathf.Infinity)) {
				selectedGameObject = null;	
			}
		}
#endif
	}
}

これで、TouchManager.selectedGameObjectにタッチしたGameObjectが格納されます。

敵を吹っ飛ばす(transform.rigidbody.AddForce)

吹っ飛ばすGameObjectのスクリプトのUpdateで、TouchManager.selectedGameObjectが対象のGameObjectと等しいか判定してあげればOK。

タッチしてたGameObjectだったら、AddForce()で外力を追加。AddForce()は1フレームだけ適用しないと、同じ力が加わり続けて彼方まで飛んで行ってしまった…

	void Update ()
	{
		
		if (TouchManager.selectedGameObject == gameObject) {
			Debug.Log ("Enemy - OnMouseDown");
			float x = Random.Range (-400.0f, 400.0f);
			float y = Random.Range (500.0f, 2000.0f);
			float z = Random.Range (1000.0f, 3000.0f);

			transform.rigidbody.AddForce (new Vector3 (x, y, z));	
			TouchManager.selectedGameObject = null;
		}
	
	}


f:id:shinga0221:20130806021048p:plain
おおー。
わかりづらいけど、スポーンっと吹っ飛んでる!


これにRagdollとか組み込めばばっちりだな…
今度やってみよう。

さて、夜も更けて参りましたので、今回はここまで。
おやすみなさい。