Не получается хороший результат при использовании WaitForSecond и щелчка мышью - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь сделать скрипт размещения блоков, который размещает блок каждые 0,15 секунды, и он работает отлично.Проблема в том, что когда я пытаюсь сделать то же самое, чтобы уничтожить блоки, вместо того, чтобы уничтожать блок каждые 0,3 секунды, он ждет 0,3 секунды, а затем уничтожает один блок на кадр.Как я могу это исправить?

Я пытался вставить его в другой скрипт, но, похоже, он тоже не работает.Странно то, что если я добавлю Debug.Log ("1") внутри ...:

void Place(){
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hitInfo;
    if(Physics.Raycast(ray, out hitInfo)){
        //here

... он печатает "1" в каждом кадре.Но если я помещаю Debug.Log ("1") в один из if if (hitInfo.collider == up){, он печатает "1" каждые 0.3 секунды.Извините за мой плохой английский / объяснение

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

public class placeBlock : MonoBehaviour {
    public GameObject cube;
    public Collider up;
    public Collider bottom;
    public Collider right;
    public Collider left;
    public Collider front;
    public Collider back;

    void Update() {
        if(Input.GetMouseButton(0)) {
             StartCoroutine(MyMethod());
        }
        if(Input.GetMouseButton(1)) {
             StartCoroutine(MyMethod2());
        }
    }

    void Place2() {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hitInfo;
        if(Physics.Raycast(ray, out hitInfo)) {
             Destroy(hitInfo.transform.parent.gameObject);
        }
    }

    void Place() {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hitInfo;
        if(Physics.Raycast(ray, out hitInfo)) {

        if (hitInfo.collider == up) {
                Instantiate(cube,new Vector3(this.transform.position.x,this.transform.position.y + 1,this.transform.position.z), Quaternion.identity);
            }
            if (hitInfo.collider == bottom) {
                Instantiate(cube,new Vector3(this.transform.position.x,this.transform.position.y - 1,this.transform.position.z), Quaternion.identity);
            }
            if (hitInfo.collider == right) {
                Instantiate(cube,new Vector3(this.transform.position.x - 1,this.transform.position.y,this.transform.position.z), Quaternion.identity);
            }
            if (hitInfo.collider == left) {
                Instantiate(cube,new Vector3(this.transform.position.x + 1,this.transform.position.y,this.transform.position.z), Quaternion.identity);
            }
            if (hitInfo.collider == front) {
                Instantiate(cube,new Vector3(this.transform.position.x,this.transform.position.y,this.transform.position.z - 1), Quaternion.identity);}
            if (hitInfo.collider == back){
                Instantiate(cube,new Vector3(this.transform.position.x,this.transform.position.y,this.transform.position.z + 1), Quaternion.identity);
            }
        }
    } 

    IEnumerator MyMethod(){
        yield return new WaitForSeconds(0.15F);
        Place();
    }

    IEnumerator MyMethod2(){
        yield return new WaitForSeconds(0.3F);
        Place2();
    }
}

1 Ответ

1 голос
/ 15 мая 2019

Первое, что я хочу отметить, это то, что вы вызываете это в каждом кадре.

if(Input.GetMouseButton(0)) {
             StartCoroutine(MyMethod());
        }

Это означает, что вы будете запускать сопрограмму в каждом кадре (при нажатии мыши). Я бы предложил переместить этот метод за пределы цикла обновления или попытаться добавить некоторый логический флаг, чтобы избежать вызова его в каждом кадре.

У вас будет что-то подобное в обновлении.

void Update()
{
        //you require a bool flag for each element
        if(Input.GetMouseButton(0) && !_alreadyPressed) {
             _alreadyPressed = true;
             StartCoroutine(MyMethod());
        }
}

А потом вы сбрасываете bool в сопрограмме. Вот так.

IEnumerator MyMethod()
{
       //you could do something here

       yield return new WaitForSeconds(0.15F);

       //do something else
       _alreadyPressed = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...