```
feat(animation): 移除多个动画控制器并更新蓝色怪物配置 移除了littleGreen和player的动画控制器及其元文件,同时删除了 人类-剑士士兵和怪物-蓝色战士的override控制器及相关的材质文件。 更新了蓝色怪物override控制器中的动画剪辑引用,将原有的动画 资源替换为新的GUID引用。 ```
This commit is contained in:
1 parent
6181e36d16
commit
b807bb80ec
36 files changed
+2873
-7233
No files matched your search
@@ -14,7 +14,7 @@ public class NewBehaviourScript : MonoBehaviour
|
||||
//活动范围
|
||||
public float range = 500f;
|
||||
|
||||
//侦查范围
|
||||
//兼容旧场景配置,目标搜索不再受此范围限制
|
||||
public float detectRange = 200f;
|
||||
|
||||
//攻击范围
|
||||
@@ -83,69 +83,104 @@ public class NewBehaviourScript : MonoBehaviour
|
||||
return;
|
||||
}
|
||||
|
||||
//获取侦查范围内除自己以外的Player层的单位
|
||||
var players = Physics.OverlapSphere(transform.position, detectRange, LayerMask.GetMask("Player"));
|
||||
//如果存在单位
|
||||
if (players.Length > 0)
|
||||
//查找场景中距离自己最近的敌对目标
|
||||
target = FindNearestOpponent();
|
||||
if (target != null)
|
||||
{
|
||||
//找出标签是Friend的,并且不是自己
|
||||
foreach (var player in players)
|
||||
state = State.Track;
|
||||
|
||||
//目标在攻击范围外则朝目标移动,否则开始攻击
|
||||
if (!IsWithinAttackReach(target))
|
||||
{
|
||||
if (player.tag == "Friend" && player != gameObject)
|
||||
{
|
||||
//进入追逐状态
|
||||
state = State.Track;
|
||||
float dis = Vector3.Distance(transform.position, player.transform.position);
|
||||
//和目标的距离在攻击范围外则朝目标移动
|
||||
if (dis > attackRange)
|
||||
{
|
||||
move(player.transform.position - transform.position);
|
||||
//打印动画speed的值
|
||||
Debug.Log(animator.GetInteger("speed"));
|
||||
}
|
||||
else
|
||||
{
|
||||
attack(player);
|
||||
}
|
||||
return;
|
||||
}
|
||||
move(target.transform.position - transform.position);
|
||||
}
|
||||
else
|
||||
{
|
||||
attack(target);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (state == State.Track)
|
||||
{
|
||||
state = State.Alert;
|
||||
}
|
||||
|
||||
//没有侦查到敌人则回到巡逻
|
||||
//没有目标时回到巡逻
|
||||
state = State.Alert;
|
||||
//角色在攻击状态则返回
|
||||
if (state == State.Alert)
|
||||
move(targetPos - transform.position);
|
||||
|
||||
//到达目标点时候随机目标点,只判断水平距离
|
||||
Vector3 patrolOffset = transform.position - targetPos;
|
||||
patrolOffset.y = 0;
|
||||
if (patrolOffset.sqrMagnitude < 0.01f)
|
||||
{
|
||||
//移动
|
||||
move(targetPos - transform.position);
|
||||
//到达目标点时候随机目标点,只判断水平距离
|
||||
Vector3 patrolOffset = transform.position - targetPos;
|
||||
patrolOffset.y = 0;
|
||||
if (patrolOffset.sqrMagnitude < 0.01f)
|
||||
randomTargetPos();
|
||||
}
|
||||
}
|
||||
|
||||
//根据自身Tag找到敌对Tag
|
||||
private string GetOpponentTag()
|
||||
{
|
||||
if (CompareTag("Friend"))
|
||||
{
|
||||
return "Enemy";
|
||||
}
|
||||
|
||||
if (CompareTag("Enemy"))
|
||||
{
|
||||
return "Friend";
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
//查找距离自己最近的敌对目标
|
||||
private GameObject FindNearestOpponent()
|
||||
{
|
||||
string opponentTag = GetOpponentTag();
|
||||
if (string.IsNullOrEmpty(opponentTag))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
GameObject nearestOpponent = null;
|
||||
float nearestSqrDistance = float.PositiveInfinity;
|
||||
GameObject[] opponents = GameObject.FindGameObjectsWithTag(opponentTag);
|
||||
|
||||
foreach (var opponent in opponents)
|
||||
{
|
||||
//排除自己以及自己所在层级中的对象
|
||||
if (opponent == gameObject || opponent.transform.root == transform.root)
|
||||
{
|
||||
randomTargetPos();
|
||||
continue;
|
||||
}
|
||||
|
||||
float sqrDistance = (opponent.transform.position - transform.position).sqrMagnitude;
|
||||
if (sqrDistance < nearestSqrDistance)
|
||||
{
|
||||
nearestSqrDistance = sqrDistance;
|
||||
nearestOpponent = opponent;
|
||||
}
|
||||
}
|
||||
|
||||
return nearestOpponent;
|
||||
}
|
||||
|
||||
//判断是否进入可攻击距离
|
||||
private bool IsWithinAttackReach(GameObject opponent)
|
||||
{
|
||||
if (opponent == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// 只保留很小的接触补偿,避免两边半径叠加导致隔空挥剑
|
||||
float reachDistance = attackRange + 0.1f;
|
||||
return Vector3.Distance(transform.position, opponent.transform.position) <= reachDistance;
|
||||
}
|
||||
|
||||
//攻击
|
||||
private void attack(Collider player)
|
||||
private void attack(GameObject friend)
|
||||
{
|
||||
//转向攻击目标
|
||||
var direction = player.transform.position - transform.position;
|
||||
direction.y = 0;
|
||||
if (direction != Vector3.zero)
|
||||
{
|
||||
transform.rotation = Quaternion.LookRotation(direction, Vector3.up);
|
||||
}
|
||||
target = friend;
|
||||
|
||||
//攻击动画动作
|
||||
animator.SetInteger("speed", 0);
|
||||
animator.SetTrigger("attack");
|
||||
@@ -156,8 +191,15 @@ public class NewBehaviourScript : MonoBehaviour
|
||||
// 在 Animator 的 Attack 动画结束时调用此方法
|
||||
public void OnAttackAnimationEnd()
|
||||
{
|
||||
//打印
|
||||
Debug.Log("攻击结束");
|
||||
//攻击动画结束后,目标仍在攻击范围内则立即进行下一次攻击
|
||||
target = FindNearestOpponent();
|
||||
if (target != null && IsWithinAttackReach(target))
|
||||
{
|
||||
attack(target);
|
||||
return;
|
||||
}
|
||||
|
||||
//目标离开攻击范围,回到追踪或巡逻逻辑
|
||||
state = State.Alert;
|
||||
randomTargetPos();
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user