目標の実現: プレイヤーが敵に非常に近づくと、敵はプレイヤーを追いかけ始め、敵がプレイヤーを追いかけた後、プレイヤーの色が変わり、敵は元の位置に戻り、プレイヤーは元の色に戻り、敵が最初の位置に戻ると、プレイヤーが自分に近づきすぎているかどうか、再度追いかけるかどうかなどを検出し続けます。
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 階建てのプラットフォームは土の山から始まり、千里の道も一歩から始まります。