###前提・実現したいこと
この図のように、自分の向いている方向からプラスマイナス30°の範囲に敵のオブジェクトが入ってきたら、それをロックオンして、なにかアクションを起こしたいと思っています。2Dではなく3Dです。
自分でもいろいろ試していますし、ネットでもいろいろ探しましたが、あまりうまくいきませんでした。
自分が主体で、敵のほうに向きをあわせるのではなく、敵がちょうど自分の視野内に入ったらなにかアクションを起こしたいと思っています。
もし範囲内に何体も敵がいたら、自分の向いている方向に近い鳥の方をロックオンしたいです。
あと、敵は空に飛んでいて、自分より高いところにいます。
###試したこと
下のコードのように、自分が操作しているキャラが向いている方向の単位ベクトルを出して、さらに、敵(鳥)と自分との単位ベクトルを出して、この二つのベクトルの角度差を求めて、その角度差が30°以内の場合にその鳥をロックオンする、みたいなことをやりましたが、あんまりうまくロックオンできませんでした...
###該当のソースコード
C#
1using UnityEngine; 2using System.Collections; 3 4public class My_Behavior : MonoBehaviour { 5 6 //鳥をロックオン用 7 private float lockCalcTimer; 8 9 void Start () { 10 lockCalcTimer = 0f; 11 } 12 13 void Update () { 14 15 //ロックオン関連 16 lockCalcTimer += Time.deltaTime; 17 if (lockCalcTimer > 0.5f) { 18 lockCalcTimer = 0f; 19 //ターゲット格納(Birdタグをしているオブジェクト) 暫定的に全オブジェクトを対象 20 GameObject[] allBird = GameObject.FindGameObjectsWithTag ("Bird"); 21 22 //自分自身が向いている方向の単位ベクトルを取得 23 float angleDir = this.transform.eulerAngles.y * (Mathf.PI / 180.0f); 24 Vector3 dir = new Vector3 (Mathf.Cos (angleDir)*0.1f, 0f, Mathf.Sin (angleDir)*0.1f); 25 26 //Vector3.Distance(a,b) -> aとbの間の距離を返す 27 foreach (GameObject obj in allBird) { 28 29 //対象の鳥の座標を取得 30 Vector3 birdV3 = obj.transform.position; 31 32 //鳥と自分との距離 33 float tmpDis = Vector3.Distance (obj.transform.position, this.transform.position); 34 35 //鳥と自分との単位ベクトル 36 Vector3 tmpV3 = (obj.transform.position - this.transform.position).normalized; 37 Vector3 tmpV2 = new Vector3 (tmpV3.x, 0f, tmpV3.z);//高さyを無視する 38 39 //向いている方向のベクトルと鳥と自分のベクトルの角度差 40 float angle = Vector3.Angle (dir, tmpV2); 41 42 //自分がどこまで遠く見えるか 43 float canSeeDis = 100f; 44 45 //自分がどの角度まで見えるか 46 float canSeeDir = 30f; 47 48 //向いている方向に+30度or-30度の範囲内に鳥がいるかどうかを確認 49 //鳥と自分の距離を確認 50 if (angle < canSeeDir && tmpDis < canSeeDis) { 51 Debug.Log ("ロックオン " + obj.name); 52 } 53 } 54 } 55 56 } 57} 58
###補足情報(言語/FW/ツール等のバージョンなど)
unity5.4 C#
回答2件
あなたの回答
tips
プレビュー