「Unity/3d/アニメーション/追跡」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→逃げるロジック) |
(→逃げるロジック) |
||
行81: | 行81: | ||
targetPointGroupObj = GameObject.Find("TargetPointGroup"); | targetPointGroupObj = GameObject.Find("TargetPointGroup"); | ||
NavStart(); | NavStart(); | ||
− | |||
} | } | ||
// 追跡ロジック開始 | // 追跡ロジック開始 | ||
行110: | 行109: | ||
{ | { | ||
// agent.SetDestination(gameObject.transform.Find("Back").transform.position); | // agent.SetDestination(gameObject.transform.Find("Back").transform.position); | ||
− | agent.SetDestination( | + | agent.SetDestination(GetFarTargetPointPosition()); |
} | } | ||
} | } | ||
} | } | ||
− | // | + | // 敵から一番遠いターゲットポイントのPositionを返す |
− | + | Vector3 GetFarTargetPointPosition() | |
{ | { | ||
float maxDistance = 0; | float maxDistance = 0; | ||
− | + | Vector3 maxDistancePosition = Vector3.zero; | |
foreach (Transform transform in targetPointGroupObj.GetComponentInChildren<Transform>()) | foreach (Transform transform in targetPointGroupObj.GetComponentInChildren<Transform>()) | ||
{ | { | ||
行125: | 行124: | ||
{ | { | ||
maxDistance = distance; | maxDistance = distance; | ||
− | + | maxDistancePosition = transform.position; | |
} | } | ||
} | } | ||
− | + | return maxDistancePosition; | |
− | return | + | |
} | } | ||
} | } |
2023年5月27日 (土) 08:59時点における版
追跡アクション追加
- 敵オブジェクトにAddComponentsでRigidbodyとCapsuleColliderを追加
- 床オブジェクトの(名前の横にある)staticにチェックをつける
- Unityメインメニュー/Window/AI/Navigationから床オブジェクトを選択し、Bakeタブを選択しBakeボタンを押す。
- 敵オブジェクトのAddComponentsからNavMeshAgentを追加
- 敵オブジェクトに以下csのようにNavMeshAgentを追加
- 障害物オブジェクトを設置してstaticにチェックを入れる。
- 障害物オブジェクトにもBakeを設定する。
using UnityEngine.AI; public class EnemyController : MonoBehaviour { NavMeshAgent agent; GameObject playerObj; void Start() { playerObj = GameObject.Find("Player"); NavStart(); } // 追跡ロジック開始 void NavStart() { if (GetComponent<NavMeshAgent>() != null) { agent = GetComponent<NavMeshAgent>(); agent.updateRotation = false; agent.updatePosition = true; } } void Update() { NavUpdate(); } // 追跡ロジック void NavUpdate() { if (playerObj != null && agent != null) { agent.SetDestination(playerObj.transform.position); } } }
追跡されない時
- 対象オブジェクトのscaleを変えてみる。
- bakeを再度やってみる
正面を向いて追跡
GameObject playerObj; float speed = 0.1f; void Start () { playerObj = GameObject.Find("Player"); } void Update() { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(playerObj.transform.position - transform.position), 0.3f); transform.position += transform.forward * speed; }
参考:https://qiita.com/ganbaru/items/d4fe649370ce4451db80
接触判定させる場合で、追いついて回転して、接触判定しないときはRigidbodyが足りないのかも・・
NavMeshAgent同士の接触半径を狭める場合は、InspectorのNavMeshAgentのRadiusを0.5から小さくする
逃げるロジック
ターゲットをいくつか用意して、そこに向かっていくように。
using UnityEngine.AI; public class PlayerController : MonoBehaviour { NavMeshAgent agent; float speed = 6f; GameObject enemyObj; GameObject targetPointGroupObj; void Start() { enemyObj = GameObject.Find("Enemy"); targetPointGroupObj = GameObject.Find("TargetPointGroup"); NavStart(); } // 追跡ロジック開始 void NavStart() { if (GetComponent<NavMeshAgent>() != null) { agent = GetComponent<NavMeshAgent>(); agent.updateRotation = false; agent.updatePosition = true; } } void Update() { UpdateNav(); UpdateLookAt(); } void UpdateLookAt() { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(enemyObj.transform.position - transform.position), 0.3f); } // 追跡ロジック void UpdateNav() { if (agent != null) { if (agent.pathStatus != NavMeshPathStatus.PathInvalid) { // agent.SetDestination(gameObject.transform.Find("Back").transform.position); agent.SetDestination(GetFarTargetPointPosition()); } } } // 敵から一番遠いターゲットポイントのPositionを返す Vector3 GetFarTargetPointPosition() { float maxDistance = 0; Vector3 maxDistancePosition = Vector3.zero; foreach (Transform transform in targetPointGroupObj.GetComponentInChildren<Transform>()) { var distance = Vector3.Distance(enemyObj.transform.position, transform.gameObject.transform.position); if (maxDistance < distance) { maxDistance = distance; maxDistancePosition = transform.position; } } return maxDistancePosition; } }
参考:https://yubeshicat.hatenablog.com/entry/2018/09/07/150259