如何使用if语句在Unity中着色?

时间:2016-02-01 09:16:57

标签: unity3d colors

我有着色问题。我想我有一些操作顺序正在进行中,但我真的不确定发生了什么。

以下是该问题的概述。我有一个改变人群的CrowdManager脚本。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class CrowdManager : MonoBehaviour
{
    public enum crowdOptions
    {None,TeamA,TeamB};

    public crowdOptions CrowdOptions;

    public static CrowdManager instance = null;

    void Awake ()
    {
        if (instance == null) {
            instance = this;
        } else if (instance != this) {
            Destroy (this.gameObject);
        }
    }

    // Use this for initialization
    void Start ()
    {
        ChangeCrowd ();
    }
}
public void ChangeCrowd ()
{
    if (PlayerPrefs.HasKey ("crowd")) {
        instance.crowdCount = PlayerPrefs.GetInt ("crowd");
        print (instance.crowdCount);
    } else {
        PlayerPrefs.SetInt ("crowd", instance.crowdCount);
    }
}

    if (instance.crowdCount <= 0) {
        instance.crowdCount += Random.Range (1, 3);
        PlayerPrefs.SetInt ("crowd", instance.crowdCount);

        if (Random.value < .33) {
            instance.CrowdOptions = crowdOptions.None;

        } else if (Random.value > .66) {
            instance.CrowdOptions = crowdOptions.TeamA;

        } else {
            instance.CrowdOptions = crowdOptions.TeamB;

        }
        // Change the crowd in the game!
    } 

    print (instance.CrowdOptions);
}

这在三个州之间随机循环,即teamA,TeamB和None。这很好用。我甚至print哪个团队已经改变了游戏。这样做的原因是,基于团队,我们应该为我的角色着色。我附上了一个精简版的颜色代码。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using Spine;

public class WinManager : MonoBehaviour
{
    public static WinManager instance = null;

    public Color teamNoneColor;
    public Color teamAColor;
    public Color teamBColor;

    public Color crowdTeamColor;

    public Color[] teamAColors = new Color[4];
    public Color[] teamBColors = new Color[4];

    void Awake ()
    {
        if (instance == null) {
            instance = this;
        } else if (instance != this) {
            Destroy (this.gameObject);
        }
    }

    // Use this for initialization
    void Start ()
    {
        TeamColorsSelected ();
    }

    // Update is called once per frame last
    void LateUpdate ()
    {
        if (CrowdManager.instance.CrowdOptions == CrowdManager.crowdOptions.None) {
            //script
        }
        if (CrowdManager.instance.CrowdOptions == CrowdManager.crowdOptions.TeamA) {
            //script
        }
        if (CrowdManager.instance.CrowdOptions == CrowdManager.crowdOptions.TeamB) {
            //script
        }
    }

    public void TeamColorsSelected ()
    {
        //Team A Colors
        teamAColors [0] = new Color (.10f, .35f, .75f, 1);
        teamAColors [1] = new Color (.37f, .19f, .58f, 1);
        teamAColors [2] = new Color (.32f, .01f, .02f, 1);
        teamAColors [3] = new Color (1f, .58f, .14f, 1);

        //Team B Colors
        teamBColors [0] = new Color (.39f, .60f, .83f, 1);
        teamBColors [1] = new Color (0f, .30f, .15f, 1);
        teamBColors [2] = new Color (1f, .89f, .17f, 1);
        teamBColors [3] = new Color (0f, .14f, .29f, 1);

        teamAColor = teamAColors [Random.Range (0, teamAColors.Length)];
        teamBColor = teamBColors [Random.Range (0, teamBColors.Length)];
        teamNoneColor = new Color (0, 1, 0, 1); //green

        if (CrowdManager.instance.CrowdOptions == CrowdManager.crowdOptions.TeamB) {
            crowdTeamColor = teamBColor;
        }
        if (CrowdManager.instance.CrowdOptions == CrowdManager.crowdOptions.TeamA) {
            crowdTeamColor = teamAColor;
        }
        if (CrowdManager.instance.CrowdOptions == CrowdManager.crowdOptions.None) {
            crowdTeamColor = teamNoneColor;
        }

        //CrowdMember Coloring
        teamCrowdMember = GameObject.Find ("RightCrowdMember").GetComponent<Renderer> ();
        crowdTeamMemberColor = teamCrowdMember.gameObject.GetComponent<SkeletonAnimation> ();

        TeamColorUpdate ();
    }

    public void TeamColorUpdate ()
    {
        //CrowdManager Clothing Colors
        crowdTeamMemberColor.skeleton.FindSlot ("torso").SetColor (crowdTeamColor);
        crowdTeamMemberColor.skeleton.FindSlot ("sleeve_left").SetColor (crowdTeamColor);
        crowdTeamMemberColor.skeleton.FindSlot ("sleeve_right").SetColor (crowdTeamColor);
    }
}

问题出在这个方面:

if (CrowdManager.instance.CrowdOptions == CrowdManager.crowdOptions.TeamB) {
    crowdTeamColor = teamBColor;
            }
if (CrowdManager.instance.CrowdOptions == CrowdManager.crowdOptions.TeamA) {
    crowdTeamColor = teamAColor;
            }
if (CrowdManager.instance.CrowdOptions == CrowdManager.crowdOptions.None) {
    crowdTeamColor = teamNoneColor;
            }

如果我设置crowdTeamColor = teamNoneColor或任何其他直接颜色。 crowdTeamColor可以工作,但是在第一次加载游戏时使用if语句将它设置为第一个团队颜色的任何颜色,然后在此之后不会改变。即使脚本在Start()中运行,我也尝试过if else语句,我认为将它们单独分开会强制它正常工作。

非常感谢任何帮助。对不起代码呕吐,但我觉得我需要显示与此问题相关的所有内容。

以下是&#34;解决方案&#34;的链接(正在进行中):https://stackoverflow.com/questions/35145664/how-do-i-color-in-unity-using-is-statements-solution

2 个答案:

答案 0 :(得分:1)

以下是该帖子的答案。谢谢您的帮助!抱歉令人困惑: - )

注意我已经清理了一些代码,以便更容易阅读。

CrowdManager.cs

using System.Collections;
using UnityEngine.UI;

public class CrowdManager : MonoBehaviour
{
using System.Collections;
using UnityEngine.UI;

public class CrowdManager : MonoBehaviour
{
    public enum CrowdTypes
    {
        None,
        TeamA,
        TeamB}
    ;

    public CrowdTypes crowdOptions;

    public int crowdCount = 5;
    public float crowdRandomRole;

    // Use this for initialization
    void Start ()
    {
        ChangeCrowd ();
    }

    public void ChangeCrowd ()
    {
        if (crowdCount <= 0) {
            crowdCount += Random.Range (1, 3);
            PlayerPrefs.SetInt ("crowd", crowdCount);

            crowdRandomRole = Random.value;

            if (crowdRandomRole < .33) {
                crowdOptions = CrowdTypes.None;
            } else if (crowdRandomRole > .66) {
                crowdOptions = CrowdTypes.TeamA;
            } else {
                crowdOptions = CrowdTypes.TeamB;
            }
    }
}

WinManager.cs

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using Spine;


public class WinManager : MonoBehaviour
{
    public CrowdManager cm;

    public bool yayButton = false;
    public bool booButton = false;

    public Color teamNoneColor;
    public Color teamAColor;
    public Color teamBColor;

    public Color crowdTeamColor;

    // Use this for initialization
    void Start ()
    {
        SetTeamColors ();
        TeamColorsSelected ();
    }

    // Update is called once per frame
    void Update ()
    {
        rightCrowdMemberAnimate = GameObject.Find ("RightCrowdMember").GetComponent<SkeletonAnimation> ();
        leftCrowdMemberAnimate = GameObject.Find ("LeftCrowdMember").GetComponent<SkeletonAnimation> ();


        if (cm.crowdOptions == CrowdManager.CrowdTypes.None) {

            //script
        }
        if (cm.crowdOptions == CrowdManager.CrowdTypes.TeamA) {

            //script
        }
        if (cm.crowdOptions == CrowdManager.CrowdTypes.TeamB) {

            //script
        }
    }

    public void SetTeamColors ()
    {
        //Team A Colors
        teamAColors [0] = new Color (.10f, .35f, .75f, 1f);
        teamAColors [1] = new Color (.37f, .19f, .58f, 1f);
        teamAColors [2] = new Color (.32f, .01f, .02f, 1f);
        teamAColors [3] = new Color (1f, .58f, .14f, 1f);

        //Team B Colors
        teamBColors [0] = new Color (.39f, .60f, .83f, 1f);
        teamBColors [1] = new Color (0f, .30f, .15f, 1f);
        teamBColors [2] = new Color (1f, .89f, .17f, 1f);
        teamBColors [3] = new Color (0f, .14f, .29f, 1f);

        teamAColor = teamAColors [Random.Range (0, 3)];
        teamBColor = teamBColors [Random.Range (0, 3)];
        teamNoneColor = new Color (0f, 1f, 0f, 1f); //green

    }

    public void TeamColorsSelected ()
    {

        //ScoreBoard Team Colors
        Image scoreBoardRed = GameObject.Find ("ScoreBoardRed").GetComponent<Image> ();
        scoreBoardRed.color = teamAColor;
        Image scoreBoardBlue = GameObject.Find ("ScoreBoardBlue").GetComponent<Image> ();
        scoreBoardBlue.color = teamBColor;

        //  crowdTeamColor = teamAColor;

        if (cm.crowdOptions == CrowdManager.CrowdTypes.TeamB) {
            crowdTeamColor = teamBColor;
        }
        if (cm.crowdOptions == CrowdManager.CrowdTypes.TeamA) {
            crowdTeamColor = teamAColor;
        }
        if (cm.crowdOptions == CrowdManager.CrowdTypes.None) {
            crowdTeamColor = teamNoneColor;
        } 

        //CrowdMember Coloring
        rightCrowdMemberRender = GameObject.Find ("RightCrowdMember").GetComponent<Renderer> ();
        rightCrowdMemberColor = rightCrowdMemberRender.gameObject.GetComponent<SkeletonAnimation> ();

        leftCrowdMemberRender = GameObject.Find ("LeftCrowdMember").GetComponent<Renderer> ();
        leftCrowdMemberColor = leftCrowdMemberRender.gameObject.GetComponent<SkeletonAnimation> ();

        TeamColorUpdate ();
    }

    public void TeamColorUpdate ()
    {
        //rightTeamMember Color Jersey
        rightCrowdMemberColor.skeleton.FindSlot ("torso").SetColor (crowdTeamColor);
        rightCrowdMemberColor.skeleton.FindSlot ("sleeve_left").SetColor (crowdTeamColor);
        rightCrowdMemberColor.skeleton.FindSlot ("sleeve_right").SetColor (crowdTeamColor);

        //rightTeamMember Color Jersey
        leftCrowdMemberColor.skeleton.FindSlot ("torso").SetColor (crowdTeamColor);
        leftCrowdMemberColor.skeleton.FindSlot ("sleeve_left").SetColor (crowdTeamColor);
        leftCrowdMemberColor.skeleton.FindSlot ("sleeve_right").SetColor (crowdTeamColor);

    }
}

我明白了。我需要更新

TeamColorsSelected ()

这一切都奏效了!感谢大家的帮助。

答案 1 :(得分:0)

如果我遇到问题,请尝试使用带有默认分支的switch case语句。 这样的事情可能有用。

switch (CrowdManager.instance.CrowdOptions) {
    case CrowdManager.crowdOptions.TeamB : 
        crowdTeamColor = teamBColor;
        break;
    case CrowdManager.crowdOptions.TeamA : 
        crowdTeamColor = teamAColor;
        break;
    case CrowdManager.crowdOptions.None :
    default : 
        crowdTeamColor = teamNoneColor;
        break;
}

CrowdManager.crowdOptions也应该是枚举。如果它不是基本类型,那么尝试使用Equals方法而不是== statement。