こんにちは。敵のAIを作っています。
そこで視覚内に入ったら敵を追従するというものを作ろうとしています。
視覚内に入る→追従はできたのですが。
ぐにゃぐにゃしながら追従というものが出来ません。
RandomMove
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class RandomMove : MonoBehaviour 6{ 7 protected IEnumerator NowAct; 8 9 #region 定数 10 protected const float FIELD_OF_VIEW_MAX = 60; // 視野範囲 11 protected const float DEG_ROT_MAX = 1; // 角度の許容値 12 protected const float ROTSPEED = 0.5f; // 回転速度 13 #endregion 14 15 16 /// <summary> 17 /// 非捕捉状態のときの挙動 18 /// </summary> 19 protected IEnumerator Nolock_Action() { 20 21 var now_Z = transform.localRotation.eulerAngles.z;//現在角度.z 22 var new_Z = now_Z + Random.Range(60f, -60f);//目標角度.z 23 24 float rotspeed = 3;//回転速度 25 float f = 0; //回転進行度 26 27 while (f <= 1) { 28 29 f += Time.deltaTime * rotspeed; 30 gameObject.transform.rotation = Quaternion.Euler(0, 0, Mathf.LerpAngle(now_Z, new_Z, f)); 31 32 yield return null; 33 } 34 35 float speed;// 移動スピード 36 float speed_Max = 4f; 37 38 float time = 0;//移動時間 39 float time_Max = 3; 40 41 uint move_sens = 0x00000001; 42 43 speed = Random.Range(0, speed_Max); 44 45 while (time < time_Max) { 46 var delta = Time.deltaTime; 47 48 time += delta; 49 var puls = (speed * delta) * move_sens; 50 transform.Translate(0, puls, 0); 51 52 yield return null; 53 } 54 55 NowAct = null; 56 } 57 /// <summary> 58 /// 移動 59 /// </summary> 60 protected virtual void Follow() { } 61}
Enemy_Limp_Move
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Enemy_Limp_Move : RandomMove 6{ 7 8 [SerializeField] Enemy_Status enemy; // ステータス 9 10 float angleValue = 0; //回転進行度 11 12 void Update() 13 { 14 var en_up = transform.up; 15 var en_to_pl = (Player.player.transform.position - transform.position); 16 17 var deg = Vector3.SignedAngle(en_up, en_to_pl, Vector3.forward); 18 19 if (Mathf.Abs(deg) <= FIELD_OF_VIEW_MAX) {// 視界内(±FIELD_OF_VIEW_MAX)か? 20 21 //視界内→追従開始 22 23 if (NowAct != null) {//NowActの中がnullでない場合、非追従処理が走っている可能性が高い。→非追従処理を止めて、破棄。 24 25 StopCoroutine(NowAct); 26 NowAct = null; 27 } 28 29 Player_Of_Rotate(deg); 30 //Player_Of_Limp_Follow(); 31 32 Follow(); 33 } 34 else { 35 36 //視界外→ランダム移動開始 37 38 if (NowAct == null) {// ランダムに回転・移動 39 40 NowAct = Nolock_Action(); 41 StartCoroutine(NowAct); 42 } 43 } 44 } 45 /// <summary> 46 /// プレイヤーの方向に回転し追従 47 /// </summary> 48 void Player_Of_Rotate(float deg) 49 { 50 51 if (Mathf.Abs(deg) >= DEG_ROT_MAX) {//角度修正 52 53 var now_Z = transform.localRotation.eulerAngles.z; //現在角度.z 54 var new_Z = now_Z + deg; //目標角度.z 55 56 if (angleValue <= 1) {// 目標角度に回転 57 58 angleValue += Time.deltaTime * ROTSPEED; 59 gameObject.transform.rotation = Quaternion.Euler(0, 0, Mathf.LerpAngle(now_Z, new_Z, angleValue)); 60 } 61 else { 62 63 angleValue = 0; 64 } 65 } 66 67 // プレイヤーの方向に前進 68 transform.position += (Player.player.transform.position - transform.position).normalized * enemy.enemy_Speed * Time.deltaTime; 69 } 70 71 72 /// <summary> 73 /// ぐにゃぐにゃ追従 74 /// </summary> 75 protected override void Follow() { 76 77 //float T = 1.0f; 78 //float f = 1.0f / T; 79 80 //var pos = transform.localPosition; 81 //pos.x = Mathf.Sin(2 * Mathf.PI * f * Time.deltaTime); 82 ////pos += (Player.player.transform.localPosition - transform.localPosition).normalized * enemy.enemy_Speed * Time.deltaTime; 83 //transform.localPosition = pos; 84 85 Vector3 pos = transform.position; 86 float sin = Mathf.Sin(Time.time)/2; 87 transform.localPosition = new Vector3(pos.x + 0, pos.y + sin, 0); 88 } 89} 90
ステータス
C#
1using System; 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6[CreateAssetMenu(fileName = "Enemy", menuName = "ScriptableObjects/CreateAsset")] 7public class Enemy_Status : ScriptableObject 8{ 9 public float enemy_Speed = 0.1f;// スピード 10} 11
今困っている事
自身の位置で横移動しない→ローカルで動かしたい。
揺れが大きい
やったこと
向きは勝手に変わるのでsinでそうゆう風な動きが出来ないかと思いやってみました。
キャラクタの正面はY軸の方向です。何種類かAIを作るので継承を使っています
この部分でSinを使ってやろうとしました。が
揺れが大きい→割る2してみたが揺れはそのまま
ローカルで移動したい→transform.localPosition に代入しているのにできない。
回答お願いします。
C#
1 Vector3 pos = transform.position; 2 float sin = Mathf.Sin(Time.time)/2; 3 transform.localPosition = new Vector3(pos.x + 0, pos.y + sin, 0);
追記
今のままのやり方
分かりにくいですが、今の状態だと桃に近づくほど揺れが大きくなります。
animationcurveのやり方
これでも中心に座標が行ってしまいます。
C#
1 2 Vector3 pos = transform.localPosition; 3 transform.position = new Vector3(curve.Evaluate(pos.x + Time.time),pos.y + 0,pos.z + 0);
回答1件
あなたの回答
tips
プレビュー