尽管我没有使用实际的教程,但我正在制作一个基于Unity的滚球教程的小游戏。我加入了一个重生机制,但是如果死后要四处走动,那么在重生之后,着陆后仍然有这种动力。我已经尝试解决此问题,但是由于使用Unity还是很陌生,所以我不确定如何解决。我有一个视频显示以下内容:https://drive.google.com/open?id=1752bPBDVOe2emN_hmnlPaD4uaJQITpsP
以下是处理重生的C#脚本:
public class PlayerBehavior : MonoBehaviour
{
Rigidbody PlayerRB;
public bool Dead;
private int timer;
public GameObject Particles;
public bool InRespawn;
void Update()
{
PlayerRB = GetComponent<Rigidbody>();
if (Dead)
{
StartCoroutine("Respawn");
}
}
IEnumerator Respawn()
{
InRespawn = true; //Used to prevent movement during respawn.
PlayerRB.useGravity = false;
transform.position = new Vector3(0, 4, 0);
transform.rotation = new Quaternion(-80, 0, 0, 0); // Resets position.
Dead = false;
Instantiate(Particles, transform); // Adds respawn particle effect.
yield return new WaitForSeconds(2);
Destroy(this.gameObject.transform.GetChild(0).gameObject);
PlayerRB.useGravity = true;
PlayerRB.AddForce(0, 400, 0); // Does a little hop.
InRespawn = false; // Tells the game that respawn is finished.
}
}
答案 0 :(得分:3)
在重生时调零刚体的速度:
IEnumerator Respawn()
{
PlayerRB.velocity = Vector3.zero;
// ... rest of method
}
作为旁注,您可能不需要在每一帧上都运行GetComponent
。这是一项昂贵的操作,因此最好不经常执行此操作:
void Start()
{
PlayerRB = GetComponent<Rigidbody>();
}
void Update()
{
if (Dead)
{
StartCoroutine("Respawn");
}
}
相反,如果您想在播放器死后禁用与播放器的所有物理交互,则可以在此期间将其设置为运动学的。只需确保取消设置isKinematic
,然后再对其施加作用力即可。
IEnumerator Respawn()
{
PlayerRB.isKinematic = true;
// ... rest of method
PlayerRB.isKinematic = false;
PlayerRB.useGravity = true;
PlayerRB.AddForce(0, 400, 0); // Does a little hop.
InRespawn = false; // Tells the game that respawn is finished.
}
答案 1 :(得分:0)
像这样在您的代码中添加一个布尔值
bool isDead=false;
那么当你死的时候就变成现实 将其添加到您的更新中
if(isDead){
rb.velocity=vector3.zero;
}
如果死了,这将阻止您移动对象