如何防止 UI 按钮在每次点击时重置为开始状态? Unity3D
How do I prevent UI button from resetting to start condition on every click? Unity3D
下面@Mario 提供的布尔问题的答案也解决了主要问题
原始 post 中的代码(在线下方)有一个不相关的问题('==' 而不是 '=')但是在修复这个问题时我意识到我遇到了问题'cubeRend.material' 的字符串名称,其后包含附加实例,因此在逻辑上似乎不等于 'material[0].'
的字符串名称
我不认为这是重置问题背后的问题,因为我确实在此处的 Unity 回答论坛上发现了一个关于类似重置问题的问题:https://answers.unity.com/questions/1303925/ui-buttons-images-resets-after-scene-reloads-scrip.html
不幸的是,没有人对我可以尝试在这种情况下应用的那个问题提供任何答复。我将尝试解决我的等效问题,然后使用改进的代码进行更新
我正在尝试让 UI 按钮在每次点击时改变立方体上的颜色。 materials 在一个数组中。在开始函数中,我将立方体渲染器的初始条件设置为 material[0]。在 ChangeCubeColor 函数(在 UI 按钮的检查器上引用)中,我使用一个简单的 if/else 语句来检查当前分配给立方体的 material。单击按钮时,Unity 似乎将 material 重置回原始状态,然后按照 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];
}
}
}
试试这个方法。这工作 2 materials 如果你想要更多你可以使用一个 int 索引并更新索引而不使用 if 对于每个 material
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:
这是更多 materials
的指数变化
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];
}
}
下面@Mario 提供的布尔问题的答案也解决了主要问题
原始 post 中的代码(在线下方)有一个不相关的问题('==' 而不是 '=')但是在修复这个问题时我意识到我遇到了问题'cubeRend.material' 的字符串名称,其后包含附加实例,因此在逻辑上似乎不等于 'material[0].'
的字符串名称我不认为这是重置问题背后的问题,因为我确实在此处的 Unity 回答论坛上发现了一个关于类似重置问题的问题:https://answers.unity.com/questions/1303925/ui-buttons-images-resets-after-scene-reloads-scrip.html
不幸的是,没有人对我可以尝试在这种情况下应用的那个问题提供任何答复。我将尝试解决我的等效问题,然后使用改进的代码进行更新
我正在尝试让 UI 按钮在每次点击时改变立方体上的颜色。 materials 在一个数组中。在开始函数中,我将立方体渲染器的初始条件设置为 material[0]。在 ChangeCubeColor 函数(在 UI 按钮的检查器上引用)中,我使用一个简单的 if/else 语句来检查当前分配给立方体的 material。单击按钮时,Unity 似乎将 material 重置回原始状态,然后按照 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];
}
}
}
试试这个方法。这工作 2 materials 如果你想要更多你可以使用一个 int 索引并更新索引而不使用 if 对于每个 material
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:
这是更多 materials
的指数变化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];
}
}