第35行的CapsuleCollider是照抄别人代码的,我根据我的需求把这里放的胶囊改成了盒子,也就是34行的BoxCollider,但34行的radius却画了红色波浪线,而没有改动的CapsuleCollider的radius却一切正常。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
[RequireComponent(typeof(NavMeshAgent))]
public class Enemy : LivingEntilty
{
public enum State
{
Idle,//待机
Chasing,//追逐
Attack,//攻击
}
NavMeshAgent agent;//FY:导航网格代理 代理;
//public Transform target;//FY:建立公有 变换 目标;
Transform target;//FY:变换 目标;
float attackDistanceThreshold = 3*3;//攻击距离阈值
//float timebetweenAttack = 1f;//攻击时间的间隔
float nextAttackTime;//攻击时间的间隔的中间数(一位up说的,没能理解)
State currentState;//FY:状态 当前状态
public GameObject gongjitexiao;//建立一个游戏物体————攻击特效
float deltatime = 0;//设置deltatime的值为0;
float myCollisonRadius;//敌人碰撞器半径
float targetCollisonRadius;//玩家碰撞器半径
protected override void Start()//索敌机制2
{
target = GameObject.Find("Player").transform;//FY:目标 = 游戏对象.寻找(“玩家”).变换;这里的“玩家”是Unity中玩家操控角色的名字
base.Start();
agent = GetComponent();//FY:目标=获取组件<导航网格代理>();
StartCoroutine(UpdatePath(0.25f, new Vector3()));
currentState = State.Chasing;//使之刷新出来就是追逐状态
//----------------------------------------------------
myCollisonRadius = GetComponent().radius; //我是34行及就近
targetCollisonRadius = target.GetComponent().radius;
//----------------------------------------------------
}
void Update()
{
//print("攻击1");
//索敌机制1:agent.SetDestination(target.position);//FY:代理.设置目的地(目标.位置);但是如果把此行代码打在Update里,就会每帧获取一次目标位置,甚消耗性能
if (Time.time > nextAttackTime)
{
//print("攻击2");
//float distance = (target.position - transform.position).sqrMagnitude;//FY:浮点数 距离 = (代理.位置 - 变换.位置).平方量级;这里的平方量级是转换Vector3成为float用的;
float jvli = (target.position - transform.position).sqrMagnitude;
if (jvli < attackDistanceThreshold)
{
//print("攻击3");
//StartCoroutine(Attack());//调用Attack(攻击动画)的代码进行运行
}
}
}
#region 攻击动画
IEnumerator Attack()
{
currentState = State.Attack;
agent.enabled = false;
//deltatime += Time.deltaTime;//数值随时间而增加;
//print("攻击前");
GameObject GJTX = Instantiate(gongjitexiao,transform.position,transform.rotation);
Destroy(GJTX, 1);
if (deltatime<1)
{
yield return new WaitForSeconds(2f);
//print("攻击4");
currentState = State.Chasing;
agent.enabled = true;
//print("攻击5");
}
//print("攻击后");
}
#endregion
IEnumerator UpdatePath(float refreshRate,Vector3 targePosition)
{
while (target != null)
{
if(currentState == State.Chasing)
{
Vector3 dirToTarget = (target.position - transform.position).normalized;
targePosition = target.position - dirToTarget*(targetCollisonRadius+myCollisonRadius);
if (!dead)
{
agent.SetDestination(targePosition);
}
}
yield return new WaitForSeconds(refreshRate);
}
}
}
我的需求是34行和35行都改成BoxCollider,并且其作用与Capsule时一样,这个能做到吗?如果不能,希望根据上下文代码给一个相似作用的另一个可行方案
该回答引用GPTᴼᴾᴱᴺᴬᴵ
在Unity中,BoxCollider和CapsuleCollider具有不同的属性,它们的半径属性也不同。BoxCollider的半径属性被称为size,而CapsuleCollider的半径属性被称为radius。因此,你不能将BoxCollider的size属性直接替换为CapsuleCollider的radius属性。
如果你要替换BoxCollider的size属性,可以通过以下方式来实现类似CapsuleCollider的行为:
1.将BoxCollider的size属性设置为一个Vector3,其中y和z值相等,而x值为所需的半径大小。
2.将BoxCollider的center属性设置为一个Vector3,其中y值为所需的半径大小的一半,而xz值为0。
例如,可以按如下方式更改第34行和第35行的代码:
myCollisonRadius = GetComponent<BoxCollider>().size.x / 2f; // 获取BoxCollider的size,并将其除以2以获得半径
targetCollisonRadius = target.GetComponent<CapsuleCollider>().radius;
然后你可以在其他代码中使用myCollisonRadius和targetCollisonRadius来计算距离和位置。
请注意,这种方法仅适用于将BoxCollider替换为CapsuleCollider的简单情况,并且只是一种相似的解决方案,不能保证所有情况都可以完全替换。如果你需要更复杂的碰撞体形状,你可能需要使用其他类型的Collider,例如SphereCollider或MeshCollider。