簡體   English   中英

如何防止 UI 按鈕在每次點擊時重置為啟動條件? Unity3D

[英]How do I prevent UI button from resetting to start condition on every click? Unity3D

下面@Mario 提供的布爾問題的答案也解決了主要問題


原始帖子中的代碼(在該行下方)有一個不相關的問題('==' 而不是 '='),但是在修復這個問題時,我意識到我的字符串名稱 'cubeRend.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]");
        }
    }
}

控制台登錄首次播放和前 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];   
    }

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

試試這個方法。 這適用於 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];
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM