Unity 3d Invokerepeating для мигания изображений - PullRequest
0 голосов
/ 14 февраля 2020

Я работаю над проектом автомобильной игры. Я сделал панель пользовательского интерфейса, в которой есть два изображения пользовательского интерфейса (Left_Image и Right_Image). Когда я нажимаю кнопку «влево», изображение Left_Image начинает мигать, а когда я нажимаю кнопку «вправо», изображение Right_Image начинает мигать. но то, что я хочу, это то, что если Right_Image уже мигает, и я нажимаю кнопку «влево», то Left_Image начинает мигать, но Right_Images должен быть остановлен. Я перепробовал каждый трюк, но не повезло. Пожалуйста, помогите.

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

public class Indicators_UI : MonoBehaviour {

    public GameObject flash_right;
    public GameObject flash_left;

    public float interval;

    void Start()
    {
        InvokeRepeating("RightFlash", 0, interval);
        InvokeRepeating("LeftFlash", 0, interval);
    }

    void Update ()
    {
        if (ControlFreak2.CF2Input.GetAxis ("right") != 0) {

            if (!IsInvoking("RightFlash"))
                InvokeRepeating("RightFlash", 0.35f, 0.35f);
        } 
        else
        {
            CancelInvoke("RightFlash");
        }
        if (ControlFreak2.CF2Input.GetAxis ("left") != 0) {
            if (!IsInvoking("LeftFlash"))
                InvokeRepeating("LeftFlash", 0.35f, 0.35f);
        } 
        else
        {
            CancelInvoke("LeftFlash");
        }
    }

    void RightFlash()
    {
        if(flash_right.activeSelf)
            flash_right.SetActive(false);
        else
            flash_right.SetActive(true);
    }

    void LeftFlash()
    {
        if(flash_left.activeSelf)
            flash_left.SetActive(false);
        else
            flash_left.SetActive(true);
    }
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Спасибо derHu go ... Я думаю, что проблема с состояниями переключения, проблему можно решить, если:

if (ControlFreak2.CF2Input.GetAxis ("left")! = 0) {

ControlFreak2.CF2Input.GetAxis ("right")! = 1

}, но я получаю ошибку: в качестве выражений объекта можно использовать только присваивание, вызов, приращение, уменьшение, ожидание и новые выражения объекта. заявление

0 голосов
/ 14 февраля 2020

В общем не используйте InvokeRepeating et c с string! Вызывать методы через их имена не очень удобно. Если вы хотите использовать их, по крайней мере, используйте nameof, чтобы убедиться, что имя не написано с ошибкой.

Тогда вы не можете просто сделать

void Update ()
{
    if (ControlFreak2.CF2Input.GetAxis ("right") != 0) 
    {
        if (!IsInvoking(nameof(RightFlash)))
        {
            if(IsInvoking(nameof(LeftFlash)) CancelInvoke(nameof(LeftFlash));

            InvokeRepeating(nameof(RightFlash), 0.35f, 0.35f);
        }
    } 
    else
    {
        CancelInvoke(nameof(RightFlash));
    }

    if (ControlFreak2.CF2Input.GetAxis ("left") != 0) 
    {
        if (!IsInvoking(nameof(LeftFlash)))
        {
            if(IsInvoking(nameof(RightFlash)) CancelInvoke(nameof(RightFlash));

            InvokeRepeating(nameof(LeftFlash), 0.35f, 0.35f);
        }
    } 
    else
    {
        CancelInvoke(nameof(LeftFlash));
    }
}

// Btw: These you can implement way shorter this way ;)
void RightFlash()
{
    flash_right.SetActive(!flash_right.activeSelf);
}

void LeftFlash()
{
    flash_left.SetActive(!flash_left.activeSelf);
}

В вашем случае я бы на самом деле предпочел бы использовать простые таймеры, так как вам все равно нужен метод Update для получения пользовательского ввода, так почему слишком сложно:

private float timerLeft;
private float timerRight;

void Update ()
{
    if (ControlFreak2.CF2Input.GetAxis ("right") != 0) 
    {
        timerRight -= Time.deltaTime;
        if (timerRight <= 0)
        {
            timerRight = interval;

            RightFlash();
        }
    }
    // simply make them exclusive so only one button is handled at a time
    // if you press both at the same time right overrules
    else if (ControlFreak2.CF2Input.GetAxis ("left") != 0) 
    {
        timerLeft -= Time.deltaTime;
        if (timerLeft <= 0)
        {
            timerLeft = interval;

            LeftFlash();
        }
    } 
}

void RightFlash()
{
    flash_right.SetActive(!flash_right.activeSelf);
}

void LeftFlash()
{
    flash_left.SetActive(!flash_left.activeSelf);
}
...