【问题标题】:Toggle between two colors when key is pressed [closed]按下键时在两种颜色之间切换[关闭]
【发布时间】:2017-12-08 19:05:56
【问题描述】:

我目前正在学习C#Unity,我创建了一个简单的游戏,您可以通过单击“C”键(将变为绿色)更改播放器的颜色(默认为红色) )。 该代码有效,但问题是,我不知道如何创建一个代码,通过使用相同的键(“C”)再次将绿色更改为红色。 我知道的唯一选择是创建另一个 if 但使用不同的按钮。 这是我的代码:

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

public class cubecolor : MonoBehaviour {


    // Use this for initialization
    void Start () {
        gameObject.GetComponent<Renderer> ().material.color = Color.red;

    }

    // Update is called once per frame
    void Update () {
        if (Input.GetKey(KeyCode.C))
            gameObject.GetComponent<Renderer> ().material.color = Color.green;

    }
}

【问题讨论】:

  • 好的,所以将颜色更改为绿色的Update 方法正确..?为什么不创建一个按钮并让它做同样的事情或调用更新方法..?是什么阻止你这样做..?
  • 对不起,我不太明白你的意思。不介意的话可以换个说法吗?

标签: c# unity3d colors


【解决方案1】:

您想按 C 键将颜色变为红色,然后再按一次变为绿色。这确实是基本的编程内容。

您需要使用一个布尔变量,然后在每次按键时翻转或反转它。翻转是通过使用! 符号完成的。如果布尔变量为真,则使用红色,否则使用绿色。我鼓励您阅读和理解 C# 中的 logical operatorsdecision making。您需要这些才能自己制作真正的游戏。

Renderer yourRenderer;
bool red = true;

// Use this for initialization
void Start()
{
    yourRenderer = gameObject.GetComponent<Renderer>();
    //Use red as default
    yourRenderer.material.color = Color.red;
}

// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.C))
    {
        //Flip the boolean variable to the opposite of what it is
        red = !red;

        //If true, use red color
        if (red)
        {
            yourRenderer.material.color = Color.red;
        }
        //If false, use green color
        else
        {
            yourRenderer.material.color = Color.green;
        }
    }
}

不相关,使用GetKeyDown 而不是GetKey 否则你会在一个帧中多次更改颜色时遇到问题,因此无法看到颜色变化。

【讨论】:

  • 它正在工作!非常感谢!
  • 不客气。请记住,这与工作与否无关。这是关于理解我写的内容,以便您可以应用它来解决您未来代码中的问题。编码愉快!
  • 是的,你完全正确!再次感谢!
【解决方案2】:

if (Input.GetKey(KeyCode.C)) 中创建一个 if-else 结构:

 void Update () {
        if (Input.GetKey(KeyCode.C))
        {
            var myObject = gameObject.GetComponent<Renderer>();

            Color currentColor = myObject.material.color;
            if(currentColor == Color.green)
            {
               myObject.material.color = Color.Red;
            }
            else
            {
               myObject.material.color = Color.Green;
            }
        }

【讨论】:

    【解决方案3】:

    使用bool 变量可以轻松完成:

                using System.Collections;
                using System.Collections.Generic;
                using UnityEngine;
    
                public class cubecolor : MonoBehaviour {
                    private bool isGreen = false; /*Let's create a boolean to store if the cube  
                    is green or red*/
    
    
                    // Use this for initialization
                    void Start () {
                        gameObject.GetComponent<Renderer> ().material.color = Color.red;
                    }
    
                    // Update is called once per frame
                    void Update () {
                        if (Input.GetKey(KeyCode.C){
                            if(isGreen){ //Check if the color is green
                                gameObject.GetComponent<Renderer> ().material.color = Color.red;
                            }else{
                                gameObject.GetComponent<Renderer> ().material.color = Color.green;
                            }
                            isGreen = !isGreen; //Switch the boolean.
                        }
                }
    

    【讨论】:

      【解决方案4】:

      我会这样做的。

      Private Renderer objectRenderer = gameObject.getComponent<Renderer>();
      Private Update() {
          If(Input.GetKeyDown(KeyCode.C))
              If(objectRenderer.material.color == Color.green)    
                 objectRenderer.material.color = Color.red;
              else
                 objectRenderer.material.color = Color.green;
      }
      

      【讨论】:

      • 两次获取gameObject.getComponent()效率低!
      • 是的,我的错,修复它^^
      • AFAIK,声明类属性时无法检索组件。您必须在 Awake / Start 方法中执行此操作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 2017-12-28
      相关资源
      最近更新 更多