【问题标题】:How do I prevent UI button from resetting to start condition on every click? Unity3D如何防止 UI 按钮在每次点击时重置为启动条件? Unity3D
【发布时间】:2020-09-15 19:37:34
【问题描述】:

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


原始帖子中的代码(行下方)有一个不相关的问题('==' 而不是 '='),但在修复该问题时,我意识到我对 'cubeRend 的字符串名称有问题.material' 包含在它之后的附加实例,因此在逻辑上似乎不等于 'material[0]' 的字符串名称。

我不认为这是重置问题背后的问题,因为我确实在 Unity 回答论坛上找到了一个关于类似重置问题的问题:https://answers.unity.com/questions/1303925/ui-buttons-images-resets-after-scene-reloads-scrip.html

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


我正在尝试让 UI 按钮在每次点击时更改立方体上的颜色。材料呈阵列状。在 start 函数中,我将立方体渲染器的初始条件设置为 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]");
        }
    }
}

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];
        }
    }
}

【问题讨论】:

  • 我很惊讶它编译了——你需要使用== 在你的if 语句中进行比较。 = 用于分配。
  • 啊,是的,我最初有 '==' 并在我试图找出其他错误的时候把它拿出来。嗯...现在它根本不进入 if/then 语句。

标签: c# unity3d uibutton reset renderer


【解决方案1】:

试试这个方法。如果您想要更多,这适用于 2 种材料,您可以使用 int 索引并更新索引而不使用 if 每种材料

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];
    }
}

【讨论】:

  • 这就是答案。它不仅解决了布尔问题,还解决了主要问题。我更新了我的问题,以引导人们回答您的问题。
猜你喜欢
  • 1970-01-01
  • 2013-05-18
  • 2014-11-13
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2019-07-06
  • 2014-12-11
相关资源
最近更新 更多