Unity Character Controller推送另一个角色控制器(我有脚本)

时间:2016-02-15 13:13:28

标签: c# unity3d

我偶然发现了一个问题。我修改了一个影响脚本,我在论坛中找到了这个脚本,让玩家使用盒子对撞机作为触发器推开另一个玩家。问题是,影响相当不一致。方向有时没有意义(玩家在推动时会朝另一个方向前进),力量从非常强到非常轻,我不知道是什么让它做到了。这是我附加到游戏对象的代码:

void FixedUpdate () {
   //p2 being player 2 character controller
    if (impact.magnitude > 0.2f)
        p2.Move (impact * Time.deltaTime);

    impact = Vector3.Lerp (impact, Vector3.zero, 5 * Time.deltaTime);
    pos = (p2.GetComponent<Transform> ().transform.position - transform.position);
}

//adds impact force
public void AddImpact(Vector3 dir, float force)
{
    dir.Normalize ();
    if (dir.y < 0)
        dir.y = -dir.y;

    if (dir.y > 0)
        dir.y = 0;

    impact += dir.normalized * force / mass;
}

public void OnTriggerEnter(Collider col)
{
    AddImpact (pos, 20);
}

每当动画播放时,我也会使用(.enabled)动画及时激活此代码。有谁能告诉我这有什么问题?经过两天盯着代码分析后,我似乎无法想象。任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

我怀疑您的AddImpact()方法存在问题。

您当前的代码将首先将dir归一化,将dir.y归零,然后使用dir计算一个力并将其添加到impact。但是,当您在最后一行评估dir.normalized * force / mass时,dir的大小不能保证为1 - 它在[0,1]的范围内,这意味着向量的大小添加到impact会在[0,力/质量]范围内的任何位置变化。这就是为什么你的力量如此强烈地变化的原因。

错误在您的逻辑中 - 当您对dir进行标准化时,您正在对矢量进行标准化,y值仍然可能为非零值。当您有效地设置dir.y = 0时,会导致dir的幅度下降未知数量,因为您已通过删除其中一个尺寸来缩短矢量。

我建议您修改以下方法:

public void AddImpact(Vector3 dir, float force)
{
    dir.y = 0;
    dir.Normalize ();
    impact += dir.normalized * force / mass;
}

通过仅在设置dir.y = 0后对矢量进行归一化,dir的大小现在在力计算中使用时保证为1。

希望这有帮助!如果您有任何问题,请告诉我。