Unityで、基本は徘徊しており、一定範囲にプレイヤーが入ると追尾モードになり、範囲から外れると元の位置に戻ってまた徘徊をするといった敵のスクリプトを書いています。
・一定の範囲にプレイヤーが入ると追尾モードになる
・範囲から外れると元の位置に戻る?
まではできたのですが、そこから徘徊を再開することができません。
移動の値を見ると、少しは動いているようなのですが……
解決方法をご教授願いたいです。
現在のスクリプトは以下の通りです。
<追尾範囲のスクリプト>
C#
1public class enemyChaseTrigger : MonoBehaviour { 2 3 public static bool emflag = false; 4 5 void OnTriggerStay(Collider col)//プレイヤーが範囲に入ると追尾を始める 6 { 7 if (col.gameObject.tag == "chara") 8 { 9 emflag = true; 10 } 11 } 12 void OnTriggerExit(Collider col)//プレイヤーが範囲から外れると追尾をやめる 13 { 14 if (col.gameObject.tag == "chara") 15 { 16 emflag = false; 17 enemyWork.enstate = 0; //元の位置に戻るのを開始する 18 } 19 } 20}
<敵の追尾スクリプト>
C#
1public class enemyChase: MonoBehaviour { 2 3 4 public Transform target; // 追いかける対象 5 public float rotMax; // 回転速度 6 public float speed; // 移動スピード 7 8 9 10 void Start() 11 { 12 target = GameObject.FindGameObjectWithTag("chara").transform; 13 } 14 15 void Update() 16 { 17 if (enemyChaseTrigger.emflag == true) 18 { 19 // ターゲット方向のベクトルを求める 20 Vector3 vec = target.position - transform.position; 21 22 // ターゲットの方向を向く 23 transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation (new Vector3 (vec.x, 0, vec.z)), rotMax); 24 transform.Translate (Vector3.forward * speed); // 正面方向に移動 25 } 26 } 27}
<敵のスクリプト(徘徊、元の位置に戻る)>
C#
1public class enemyWork : MonoBehaviour { 2 3 public Vector3 StartPos; //初期位置 4 public Vector3 EndPos; //往復後位置 5 public float time; //移動時間 6 private Vector3 deltaPos; //移動量 7 private float elapsedTime; //反転用経過時間 8 private bool bStartToEnd = true; 9 public float dirRot = 0.0f ; 10 public float offset; 11 Vector3 vec; 12 13 public static int enstate = 1; 14 Vector3 AripPos; //追尾をやめたときの位置 15 16 void Start () 17 { 18 transform.position = StartPos; 19 deltaPos = (EndPos - StartPos) / time; 20 vec = StartPos - EndPos; 21 elapsedTime = 0; 22 AripPos = transform.position; 23 } 24 25 26 void Update () 27 { 28 if (enemyChaseTrigger.emflag == false)//プレイヤーが範囲から外れているとき 29 { 30 AripPos = transform.position; 31 transform.position += deltaPos * Time.deltaTime; 32 33 vec.Normalize (); 34 dirRot += ( Mathf.Atan2 (vec.x, vec.z) / 3.14159265f * 180.0f - dirRot ) * 0.2f ; 35 transform.eulerAngles = new Vector3 (0.0f, dirRot + offset, 0.0f); 36 37 switch (enstate) 38 { 39 case 0: //追尾をやめて元の位置に戻る 40 deltaPos = (StartPos - AripPos) / time; 41 vec = AripPos - StartPos; 42 if (transform.position == StartPos) 43 { 44 enstate = 1; 45 } 46 break; 47 case 1: //徘徊する、徘徊を再開する 48 elapsedTime += Time.deltaTime; 49 if (elapsedTime > time) // 移動開始してからの経過時間がtimeを超えると往路復路反転 50 { 51 if (bStartToEnd) 52 { 53 deltaPos = (StartPos - EndPos) / time; 54 vec = EndPos - StartPos; 55 transform.position = EndPos; 56 } 57 else 58 { 59 deltaPos = (EndPos - StartPos) / time; 60 vec = StartPos - EndPos; 61 transform.position = StartPos; 62 } 63 64 bStartToEnd = !bStartToEnd; 65 elapsedTime = 0; 66 } 67 break; 68 } 69 } 70 } 71}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/22 07:59