我有着色问题。我想我有一些操作顺序正在进行中,但我真的不确定发生了什么。
以下是该问题的概述。我有一个改变人群的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
答案 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。