「Unity/3d/アニメーション/追跡」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→追跡アクション追加) |
|||
| 行12: | 行12: | ||
{ | { | ||
NavMeshAgent agent; | NavMeshAgent agent; | ||
| + | GameObject playerObj; | ||
void Start() | void Start() | ||
| + | { | ||
| + | playerObj = GameObject.Find("Player"); | ||
| + | NavStart(); | ||
| + | } | ||
| + | // 追跡ロジック開始 | ||
| + | void NavStart() | ||
{ | { | ||
if (GetComponent<NavMeshAgent>() != null) | if (GetComponent<NavMeshAgent>() != null) | ||
| 行23: | 行30: | ||
void Update() | void Update() | ||
{ | { | ||
| − | + | NavUpdate(); | |
| − | if ( | + | } |
| + | // 追跡ロジック | ||
| + | void NavUpdate() | ||
| + | { | ||
| + | if (playerObj != null && agent != null) | ||
{ | { | ||
| − | agent.SetDestination( | + | agent.SetDestination(playerObj.transform.position); |
} | } | ||
} | } | ||
| 行38: | 行49: | ||
==正面を向いて追跡== | ==正面を向いて追跡== | ||
<pre> | <pre> | ||
| − | + | GameObject playerObj; | |
| − | + | float speed = 0.1f; | |
void Start () { | void Start () { | ||
| − | + | playerObj = GameObject.Find("Player"); | |
} | } | ||
void Update() { | void Update() { | ||
| − | transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation( | + | transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(playerObj.transform.position - transform.position), 0.3f); |
transform.position += transform.forward * speed; | transform.position += transform.forward * speed; | ||
} | } | ||
2023年5月27日 (土) 01:58時点における版
追跡アクション追加
- 敵オブジェクトに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から小さくする
