如何防止UI按钮每次单击重置为启动状态? Unity3D

问题描述

下面@Mario提供的布尔问题的答案也解决了主要问题


原始帖子(在下面)中的代码有一个不相关的问题(“ ==”而不是“ =”),但是在修复时,我意识到我遇到了字符串名称为“ cubeRend”的问题.material”,其后包括加法实例,因此在逻辑上似乎不等于字符串名称“ material [0]”。

我不认为这是重置问题的根源,因为我在https://answers.unity.com/questions/1303925/ui-buttons-images-resets-after-scene-reloads-scrip.html

的Unity答案论坛上确实找到了关于类似重置问题的问题。

不幸的是,没有人对这个问题提供任何答复,在这种情况下,我可以尝试应用该答复。我将尝试解决等效问题,然后使用改进的代码进行更新


我试图使UI按钮在每次单击时更改多维数据集上的颜色。这些材料成阵列排列。在启动函数中,我将多维数据集渲染器的初始条件设置为material [0]。在ChangeCubeColor函数(在UI按钮的检查器上引用)中,我使用了一个简单的if / else语句来检查当前分配给多维数据集的材质。单击按钮后,Unity似乎将材料重置为原始状态,然后按照if / else指令将其设置为阵列中的第二种颜色,因此对眼睛不可见。这样做的影响是,第一次播放时,按钮会更改颜色,但是每次之后,该颜色都会停留在第二种颜色上。

这是我的代码。对于所有调试语句,我深表歉意。我试图弄清楚状态何时改变或没有改变。我还包括了首次播放时控制台的屏幕截图以及该按钮的前3次单击。最后,为了清晰起见,删除了带有调试语句的代码。

提前感谢任何想法。

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

public class ChangeCubeColor : MonoBehaviour
{
    public Material[] material;

    Renderer cubeRend;
 
    void Start()
    {
        cubeRend = GetComponent<Renderer>();
        cubeRend.material = material[0];   

        Debug.Log(cubeRend.material);
    }

    public void CubeColorChange()
    {
        if(cubeRend.material = material[0])
        {
            Debug.Log("cubeRend.material = material[0]");
            cubeRend.material = material[1];
            Debug.Log("Make 1:  "+cubeRend.material);
            Debug.Log("cubeRend.material = material[1]");
        }
        else if (cubeRend.material = material[1])
        {
            Debug.Log("cubeRend.material = material[1]");
            cubeRend.material = material[0];
            Debug.Log("Make 0:  " + cubeRend.material);
            Debug.Log("cubeRend.material = material[0]");
        }
    }
}

Console log upon first play and first 3 button clicks

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

public class ChangeCubeColor : MonoBehaviour
{
    public Material[] material;

    Renderer cubeRend;
 
    void Start()
    {
        cubeRend = GetComponent<Renderer>();
        cubeRend.material = material[0];   
    }

    public void CubeColorChange()
    {
        if(cubeRend.material = material[0])
        {
            cubeRend.material = material[1];
        }
        else if (cubeRend.material = material[1])
        {
            cubeRend.material = material[0];
        }
    }
}

解决方法

尝试这种方式。如果需要更多内容,则可用于2种材料,如果每种材料都可以使用int索引并更新索引而无需使用

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

public class ChangeCubeColor : MonoBehaviour
{
    public Material[] material;
    public bool state;

    Renderer cubeRend;
 
    void Start()
    {
        cubeRend = GetComponent<Renderer>();
        cubeRend.material = material[0];
        //state = false is material 0 //state = true is material 1
        state = false;
    }

    public void CubeColorChange()
    {
        //Change the state to the other state
        state = !state;
        cubeRend.material = (state) ? material[1] : material[0];
        
    }
}

编辑1:

这是更多材料随索引的变化

using UnityEngine;

public class ChangeCubeColor : MonoBehaviour
{
    public Material[] material;
    public int index;

    Renderer cubeRend;

    void Start()
    {
        cubeRend = GetComponent<Renderer>();
        index = 0;
        cubeRend.material = material[index];        
    }

    public void CubeColorChange()
    {
        //Increase index
        index = (material.Length - 1 > index) ? index + 1 : 0;
        cubeRend.material = material[index];
    }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...