NavMeshAgent コンポーネントを使用して、プレイヤーが敵に近づき、敵がプレイヤーを追いかける効果を実現します

目標の実現: プレイヤーが敵に非常に近づくと、敵はプレイヤーを追いかけ始め、敵がプレイヤーを追いかけた後、プレイヤーの色が変わり、敵は元の位置に戻り、プレイヤーは元の色に戻り、敵が最初の位置に戻ると、プレイヤーが自分に近づきすぎているかどうか、再度追いかけるかどうかなどを検出し続けます。

1. シーンを構築し、カメラの画角を調整します (緑色のボールがプレイヤーを表し、赤色のボールが敵を表します)

2. 選択したプレーンでナビゲーション ベイク操作を実行し、プレーヤーと敵の NavMeshAgent コンポーネントを同時に追加します (関連操作: 前の記事を参照してください: https://blog.csdn.net/falsedewuxin/article/details ) /129225267?spm=1001.2014 .3001.5501 )

3. プレイヤーと敵にそれぞれ対応するスクリプトをマウントします。

プレーヤー

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class Player : MonoBehaviour
{
    NavMeshAgent playerNav;
    // Start is called before the first frame update
    void Start()
    {
        playerNav = GetComponent<NavMeshAgent>();
        //设置导航代理的移动速度
        playerNav.speed = 5.0f;
    }

    // Update is called once per frame
    void Update()
    {
        Ray CameraRay=Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if(Physics.Raycast(CameraRay,out hit)&&Input.GetMouseButtonDown(0))
        {
            //检测是否为Plane
            if(hit.collider.name == "Plane")
            {
                playerNav.SetDestination(hit.point);
            }
        }
        
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class Enemy : MonoBehaviour
{
    NavMeshAgent enemyNav;
    GameObject player;
    Vector3 startPos;
    bool isBack=false;
    // Start is called before the first frame update
    void Start()
    {
        enemyNav = GetComponent<NavMeshAgent>();
        //设置导航代理的速度
        enemyNav.speed = 2.0f;
       //这里的Player要和Hierarchy中的Player名称一致
        player = GameObject.Find("Player");
        startPos=transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        //player离enemy太近,则enemy开始追击player,追到playr之后,player变为黑色,enemy会先回到自己的起始位置,然后再次检测player离的是否过近,是否再次追击
        if(Vector3.Distance(transform.position,player.transform.position)<2&&!isBack)
        {
            enemyNav.SetDestination(player.transform.position);
            if(Vector3.Distance(transform.position,player.transform.position)<1)
            {
                player.GetComponent<MeshRenderer>().material.color = Color.black;
                isBack = true;
            }
        }
        else
        {
            //player离enemy太远,则enemy回到自己最初的位置
            enemyNav.SetDestination(startPos);
            if(Vector3.Distance(transform.position,startPos)<0.1)
            {
                //回到起始位置后,isBack变为false,表示enemy可以再次检测player是否离的太近,是否再次追击
                isBack = false;
                //enemy回到起始位置后,把player变会绿色
                player.GetComponent<MeshRenderer>().material.color = Color.green;
            }
        }   
    }
}

4. Unity を実行し、[平面] をクリックして効果をテストします。

結論: 抱きしめる木は髪の毛の先に生まれ、9 階建てのプラットフォームは土の山から始まり、千里の道も一歩から始まります。

おすすめ

転載: blog.csdn.net/falsedewuxin/article/details/129489013