Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与向空中投掷玩家物体的刚体相撞_C#_Unity3d_Game Physics - Fatal编程技术网

C# 与向空中投掷玩家物体的刚体相撞

C# 与向空中投掷玩家物体的刚体相撞,c#,unity3d,game-physics,C#,Unity3d,Game Physics,我有一个刚体连接到我的角色控制器和我的敌人。我希望敌人能够围住我,让我在我无法移动的情况下被困住,所以我相应地设置了质量属性 这只是一个小问题——如果我没有将质量设置得足够高,当敌人与我碰撞时,我的玩家就会飞到空中。如果我不把敌人的质量设置得足够高,我就可以直接穿过他们。如何解决此问题?以下是玩家的移动代码: using UnityEngine; using System.Collections; public class CharController : MonoBehaviour {

我有一个
刚体连接到我的角色控制器和我的敌人。我希望敌人能够围住我,让我在我无法移动的情况下被困住,所以我相应地设置了质量属性

这只是一个小问题——如果我没有将质量设置得足够高,当敌人与我碰撞时,我的玩家就会飞到空中。如果我不把敌人的质量设置得足够高,我就可以直接穿过他们。如何解决此问题?以下是玩家的移动代码:

using UnityEngine;
using System.Collections;

public class CharController : MonoBehaviour {

    public float speed;

    void Start () {
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update () {
        float translation = Input.GetAxis ("Vertical") * speed;
        float strafe = Input.GetAxis ("Horizontal") * speed;
        translation *= Time.deltaTime;
        strafe *= Time.deltaTime;

        transform.Translate (strafe, 0, translation);

        if (Input.GetKeyDown ("escape")){
            Cursor.lockState = CursorLockMode.None;
        }
    }
}

确保选中了
iskinetic
<代码>使用重力
可根据您的情况进行检查或不检查

这样,刚体将不会受到力、碰撞或关节的影响,并且完全受脚本的控制。但也许它们也会失去检测碰撞的能力,但我不太确定,我还没有测试过

如果是这种情况,请取消选中
iskinetic
,同时选中
FreezeRotation
FreezePosition
。这样,你们就可以取消对物理的控制,不影响你们的位置和旋转。您将从脚本手动操作位置和旋转(使用CharacterController)

参考资料:


这里的问题是,您正在使用
Transform.Translate()
移动播放器对象。因此,玩家将在物理计算之间被移动到与敌人的物体进行剪裁-因此,当下一次物理计算到来时,将有一个巨大的斥力来纠正这一点。这就是让你的玩家飞起来的原因

更好的选择是使用(或其变体之一)间接移动玩家对象。这允许玩家对象的运动在物理计算中被考虑在内,因此它可以在开始剪切敌人对象之前与敌人对象碰撞并被敌人对象阻止

如果在变量中检索并存储对播放器的
刚体的引用
,则可以使用以下内容替换
Translate()

rigidbody.AddRelativeForce(strafe, 0, translation);

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

如果您包含当前的移动代码,这将对此处的用户有所帮助,因为这可能是解决方案的一个组成部分。@Serlite我已将其编辑为包含我的键盘移动脚本。此脚本放置在胶囊碰撞器上。敌人也有一个navmesh组件附在上面。你有没有考虑过使用物理方法,比如
AddForce()
,而不是直接翻译?你得到这些大规模物理过度反应的原因是因为在物理计算之间,转换将玩家移动到你的敌人中,产生了巨大的排斥力。如果你改为使用物理模拟间接移动你的播放器,这些问题应该会消失。@Serlite事实上,这就是我需要做的。“碰撞”更精确,并且可以对碰撞器做出更好的反应,将力应用于角色而不是平移对象。@Serlite我已将transform.translate更改为rb.addrelativeforce将rb定义为玩家的刚体,它可以根据需要工作。你能发表你的评论作为回答吗?这样我就可以给你正确的回答了?如果你试图进行精确的物理实验(包括碰撞),不通过力模型是非常有害的。它永远不会看起来正确,或者工作得特别好,你最终会出现所描述的各种行为。