Как остановить движение и / или вращение игрового объекта Unity - PullRequest
2 голосов
/ 05 ноября 2019

Я делаю небольшую игру, основанную на обучающей программе Roll-A-Ball от 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.
    }
}

Ответы [ 2 ]

3 голосов
/ 05 ноября 2019

Обнуление скорости твердого тела при появлении респауна:

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.
}
0 голосов
/ 06 ноября 2019

создайте в своем коде bool как этот

bool isDead=false;

, а затем сделайте это правдой, когда вы умрете, добавьте это в ваше обновление

if(isDead){
rb.velocity=vector3.zero;
}

это остановит движение ваших объектов, если ономертв

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...