Unity3d AddForce根据位置更改行为

Unity3d AddForce根据位置更改行为,unity3d,Unity3d,我试图使用AddForce,让敌人跳向目标进行攻击,但增加的力量似乎很大程度上取决于实体在场景中的位置() 问题可能是什么 void Start(){ ani = GetComponent<Animation>(); agent = GetComponent<NavMeshAgent>(); rig = GetComponent<Rigidbody>(); state = states.idle; } private void

我试图使用
AddForce
,让敌人跳向目标进行攻击,但增加的力量似乎很大程度上取决于实体在场景中的位置()

问题可能是什么

void Start(){
    ani = GetComponent<Animation>();
    agent = GetComponent<NavMeshAgent>();
    rig = GetComponent<Rigidbody>();
    state = states.idle;
}

private void Attack(){
    state = states.attack;
    agent.enabled = false;
    ani.Play("attack3");
    Vector3 force = transform.forward * 300f;
    force.y = 750f;
    rig.AddForce(force);
}
void Start(){
ani=GetComponent();
agent=GetComponent();
rig=GetComponent();
state=states.idle;
}
私有无效攻击(){
state=states.attack;
agent.enabled=false;
ani.Play(“攻击3”);
矢量3力=transform.forward*300f;
力y=750f;
钻机。附加力(力);
}

如果看不到更多的代码,很难说,但有一件事对我来说确实很突出:如果你的实体绕x轴旋转(即,可以向上或向下倾斜),那么你可以从你的代码中看到你描述的行为。(从您的视频中不清楚是否存在这种情况,但您的地面似乎有一些坡度,如果模型与地面对齐,可能会导致这种情况。)

考虑:如果你的代理正对着Z轴,那么它的
transform.forward
y
为零。
force
的初始值的大小将为
300
(并且
y
仍然为零)。然后将
y
设置为
750
,总作用力为
(0750300)

现在考虑你的代理人几乎完全向上。code>transform.forward现在是
(0299,0.01)
,然后乘以300,然后设置
y=750
。对于向同一方向跳跃的代理,现在产生的力是
(0750,3)

您可以通过修改
攻击的结尾来解决此问题,如下所示:

Vector3 horizontalDirection = new Vector3(transform.forward.x, 0, transform.forward.z);
Vector3 force = horizontalDirection.normalized * 300f;
force.y = 750f;
rig.AddForce(force);
上述代码保证无论角色朝向哪个方向,力的大小都是一致的


(@fafase在评论中提到的另一个问题也是一个非常合理的原因,可能是其中一个或两个原因造成的!)

我认为这与您如何称呼攻击方法有关。最有可能的是,在视频的第一种情况下,该方法被调用一次,而在第二种情况下,它恰好在多个帧上被调用。您应该提供整个AI脚本,可能通过dropbox或其他方式。同意,您可以粘贴调用攻击方法的脚本吗