タッチ(クリック)した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; } }
おおー。
わかりづらいけど、スポーンっと吹っ飛んでる!
これにRagdollとか組み込めばばっちりだな…
今度やってみよう。
さて、夜も更けて参りましたので、今回はここまで。
おやすみなさい。