unity实现敌人的功能:正常状态下站立,如果过了三秒就开始随机巡逻,到达了指定的目标点后回到正常状态站立。
时间: 2024-03-22 15:38:54 浏览: 160
可以通过以下步骤来实现敌人的功能:
1. 在Unity中创建一个敌人对象,添加一个Animator组件,设置敌人的站立动画和巡逻动画。
2. 添加一个脚本组件,命名为EnemyController,并添加以下代码:
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyController : MonoBehaviour
{
public Transform[] waypoints; // 存储巡逻的目标点
public float patrolSpeed = 2f; // 巡逻速度
public float waitTime = 3f; // 等待时间
public float turnSpeed = 5f; // 转向速度
private int currentWaypointIndex = 0; // 当前目标点的索引
private Animator animator; // 敌人的动画控制器
private bool isPatrolling = false; // 是否在巡逻状态
private float timer = 0f; // 计时器
void Start()
{
animator = GetComponent<Animator>();
}
void Update()
{
if (!isPatrolling)
{
// 如果不在巡逻状态,播放站立动画
animator.SetBool("isPatrolling", false);
return;
}
// 如果在巡逻状态,播放巡逻动画
animator.SetBool("isPatrolling", true);
// 计时器开始计时
timer += Time.deltaTime;
// 如果计时器超过等待时间,切换目标点
if (timer > waitTime)
{
currentWaypointIndex++;
if (currentWaypointIndex >= waypoints.Length)
{
currentWaypointIndex = 0;
}
timer = 0f;
}
// 计算敌人需要转向的方向
Vector3 targetDirection = waypoints[currentWaypointIndex].position - transform.position;
targetDirection.y = 0f;
// 计算敌人需要转向的角度
float angle = Vector3.Angle(transform.forward, targetDirection);
// 如果敌人需要转向,旋转敌人的朝向
if (angle > 5f)
{
Quaternion targetRotation = Quaternion.LookRotation(targetDirection);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, turnSpeed * Time.deltaTime);
}
// 移动敌人
transform.Translate(Vector3.forward * patrolSpeed * Time.deltaTime);
}
// 进入巡逻状态
public void StartPatrolling()
{
isPatrolling = true;
}
// 退出巡逻状态
public void StopPatrolling()
{
isPatrolling = false;
}
}
```
3. 在敌人对象上添加一个空对象,命名为Waypoints,用来存储巡逻的目标点。
4. 在Waypoints对象下添加多个子对象,命名为Waypoint1、Waypoint2、Waypoint3等,调整它们的位置,设置为敌人巡逻的目标点。
5. 在敌人对象的EnemyController组件中,将Waypoints对象的子对象添加到waypoints数组中。
6. 在Unity中创建一个空对象,命名为EnemyManager,添加一个脚本组件EnemyManager,并添加以下代码:
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyManager : MonoBehaviour
{
public EnemyController enemy; // 敌人对象
void Start()
{
// 开始时敌人处于正常状态
enemy.StopPatrolling();
}
void Update()
{
// 计时器开始计时
enemy.timer += Time.deltaTime;
// 如果计时器超过3秒,进入巡逻状态
if (enemy.timer > 3f)
{
enemy.StartPatrolling();
}
// 如果敌人到达目标点,回到正常状态
if (Vector3.Distance(enemy.transform.position, enemy.waypoints[enemy.currentWaypointIndex].position) < 0.1f)
{
enemy.StopPatrolling();
enemy.timer = 0f;
}
}
}
```
7. 在Unity中创建一个空对象,命名为Enemy,将敌人对象和EnemyManager对象拖拽到Enemy对象下,然后调整敌人对象的位置。
现在,当运行游戏时,敌人处于正常状态,如果过了三秒就开始随机巡逻,到达了指定的目标点后回到正常状态站立。
阅读全文