как сделать игровой объект неактивным и активным через несколько секунд в единстве? - PullRequest
0 голосов
/ 26 октября 2019

Я хочу сделать игровой объект неактивным, когда игрок сталкивается с игровым объектом (это я и сделал). Теперь я хочу подождать несколько секунд, а затем снова активировать его. как я могу это сделать?

вот мой код

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement: MonoBehaviour
{

private float chubbyScore = 0;
private float coin = 0;
public float speed = 1;
public float jump = 1;

void Update()
{
    Vector3 playerMovement = Vector3.zero;
    playerMovement.x = Input.GetAxis("Horizontal");
    transform.position += playerMovement * speed * Time.deltaTime;
    transform.Translate(Vector3.forward * Time.deltaTime * speed);

    if (Input.GetKeyDown(KeyCode.Space))
    {
        GetComponent<Rigidbody>().velocity = Vector3.up * jump;
    }
}

void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("Pick Up"))
    {
        other.gameObject.SetActive(false);
        coin += 1;
        chubbyScore += 50;
    } 

}
}

Ответы [ 3 ]

1 голос
/ 26 октября 2019

Создайте простую универсальную утилиту ожидания, например:

public class Waiter : MonoBehaviour
{
    static Waiter instance = null;
    static Waiter Instance
    {
        get
        {
            if (instance == null)
                instance = new GameObject("Waiter").AddComponent<Waiter>();
            return instance;
        }
    }
    private void Awake()
    {
        instance = this;
    }
    private void OnDestroy()
    {
        if (instance == this)
            instance = null;
    }

    IEnumerator WaitRoutine(float duration, System.Action callback)
    {
        yield return new WaitForSeconds(duration);
        callback?.Invoke();
    }

    public static void Wait(float seconds, System.Action callback)
    {
        Instance.StartCoroutine(Instance.WaitRoutine(seconds, callback));
    }
}

Она автоматически внедряется в игру при необходимости, вам просто нужно создать скрипт, теперь в вашем OnTriggerEnter

 void OnTriggerEnter(Collider other)
 {
     if (other.gameObject.CompareTag("Pick Up"))
     {
         collObj = other.gameObject;
         collObj.SetActive(false);
         Waiter.Wait(3, () =>
         {
             // Just to make sure by the time we're back to activate it, it still exists and wasn't destroyed.
             if (collObj != null)
                collObj.SetActive(true);
         });
         coin += 1;
         chubbyScore += 50;
      }
 }
1 голос
/ 26 октября 2019

Я бы создал публичный float для продолжительности смещения, затем вы можете создать приватный float для таймера.

Код для установки активного состояния ваших объектов может выглядеть примерно так:

private float chubbyScore = 0;
private float coin = 0;
public float speed = 1;
public float jump = 1;
public float offsetTime = 2f;
private float timer = 0f;
private GameObject collObj;

void Update()
{
    Vector3 playerMovement = Vector3.zero;
    playerMovement.x = Input.GetAxis("Horizontal");
    transform.position += playerMovement * speed * Time.deltaTime;
    transform.Translate(Vector3.forward * Time.deltaTime * speed);

    if (Input.GetKeyDown(KeyCode.Space))
    {
        GetComponent<Rigidbody>().velocity = Vector3.up * jump;
    }

    if(!collObj.active)
    {
        timer += Time.deltaTime;
        if(timer > offsetTime)
        {
            timer = 0f;
            collObj.SetActive(true);
        }
    }
}

void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("Pick Up"))
    {
        collObj = other.gameObject;
        collObj.SetActive(false);
        coin += 1;
        chubbyScore += 50;
    }

}
0 голосов
/ 27 октября 2019

Создайте новую функцию, в которой вы включаете / отключаете игровой объект. Затем в методе start повторно вызывайте недавно созданную функцию.

//Enables or Disables the GameObject every 5 seconds
void Start()
{
     InvokeRepeating("Repeat", 0, 5);
}

void Repeat()
{
     //Enable or Disable the GameObject
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...