我的角色控制者和我的敌人附有Rigidbody
。我希望敌人能够围住我并让我陷入困境而不能让我移动,所以我相应地设置了质量属性。
这只是一个小问题 - 如果我没有将我的质量设置得足够高,那么当敌人与我发生碰撞时,我的玩家将会飞向空中。如果我不把敌人的质量设置得足够高,我就可以穿过它们。我该如何解决这个问题?以下是播放器的移动代码:
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;
}
}
}
答案 0 :(得分:2)
这里的问题是你使用Transform.Translate()
来移动你的玩家对象。结果,玩家在物理计算之间被移动到你的敌人物体的剪辑 - 所以当下一次物理计算到来时,会有一个巨大的排斥力来纠正这个。这就是让你的玩家飞行的原因。
更好的选择是使用Rigidbody.AddForce()
(或其变体之一)间接移动玩家对象。这允许在物理计算期间考虑玩家对象的移动,因此它可以在敌人对象开始剪切之前与敌人碰撞并被其拦截。
如果您在变量中检索并存储了对玩家Rigidbody
的引用,那么您可以将Translate()
替换为:
rigidbody.AddRelativeForce(strafe, 0, translation);
希望这有帮助!如果您有任何问题,请告诉我。
答案 1 :(得分:1)
确保选中IsKinematic
。可以检查UseGravity
是否取决于您的情况。
这样,你的刚体就不会受到力,碰撞或关节的影响,并且完全可以控制你的剧本。但也许他们也会失去检测碰撞的能力,但我不太确定,我还没有测试过它。
如果是这种情况,请取消选中IsKinematic
,同时检查FreezeRotation
和FreezePosition
。这样,您就可以撤消对物理的控制,从而影响您的位置和旋转。你将手动操纵位置和从脚本中旋转(使用CharacterController)。
参考文献:
https://docs.unity3d.com/ScriptReference/Rigidbody-isKinematic.html https://docs.unity3d.com/Manual/class-Rigidbody.html