【问题标题】:Unity Character Controller pushing another Character Controller (i have script)Unity Character Controller 推送另一个 Character Controller(我有脚本)
【发布时间】:2016-02-15 13:13:27
【问题描述】:

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

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) 及时激活此代码。谁能告诉我这有什么问题?经过两天的代码分析,我似乎无法做到。任何帮助将不胜感激

【问题讨论】:

  • 是不是打算让 dir.y 在AddImpact() 中总是以零结尾?我可能弄错了,但是在当前代码中,如果 dir.y 为负数,则切换符号使其为零或正数,然后如果大于零,则最终为零。与dir.y = 0; 相同

标签: c# unity3d


【解决方案1】:

我怀疑你的 AddImpact() 方法有问题。

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

错误在于您的逻辑 - 当您规范化 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。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 2011-08-16
    • 2022-06-22
    • 2011-09-28
    相关资源
    最近更新 更多