2017-02-16 57 views
0

我试图改变场景中玩家的精灵。 我有一个脚本,用于管理从玩家切换到另一个时激活哪个脚本。 我想添加的功能,当切换非活动播放器变黑&白色形成一个精灵和活跃球员mantain有色精灵。 任何人都可以帮助,因为不会改变玩家的精灵和玩家的第二个游戏对象吗?在触摸按钮时更改玩家的精灵Unity 2D

下面是代码:

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

public class switchCharacter : MonoBehaviour { 

    public GameObject Psyco1; 
    public GameObject Psyco2; 
    public PlayerControllerPsyco1 script1; 
    public PlayerControllerPsyco2 script2; 
    public Sprite sprite1; // Psyco1 color 
    public Sprite sprite2; // Psyco2 decolorized 
    public SpriteRenderer spriteRendererPsyco1; 
    public SpriteRenderer spriteRendererPsyco2; 

    void Start(){ 
     script1 = Psyco1.GetComponent<PlayerControllerPsyco1>(); 
     script2 = Psyco2.GetComponent<PlayerControllerPsyco2>(); 
     script1.enabled = true; 
     script2.enabled = false; 
     spriteRendererPsyco1 = GetComponent<SpriteRenderer>(); 
     spriteRendererPsyco2 = GetComponent<SpriteRenderer>(); 
     if (spriteRendererPsyco1.sprite == null) // if the sprite on spriteRenderer is null then 
      spriteRendererPsyco1.sprite = sprite1; // set the sprite to Psyco1 Color 
    } 

    void Update(){ 
     if (Input.GetButtonDown("switch1")){ 
      script1.enabled = !script1.enabled; 
      script2.enabled = !script2.enabled; 
      //spriteRendererPsyco1.sprite = sprite2; 
      DesaturizePsyco(); // call method to change Psyco sprite 
     } 
    } 

    public void changeCharacterBtn() { 
     if (script1.enabled = !script1.enabled) // if the spriteRenderer sprite = sprite1 then change to sprite2 
     { 
      GameObject.Find ("PlayerFirst").GetComponent<SpriteRenderer>().sprite = sprite2; 
     } 
     //script1.enabled = !script1.enabled; 
     if (script2.enabled = !script2.enabled;) // if the spriteRenderer sprite = sprite1 then change to sprite2 
     { 
      GameObject.Find ("PlayerSecond").GetComponent<SpriteRenderer>().sprite = sprite1; 
     } 
     //script2.enabled = !script2.enabled; 
     DesaturizePsyco(); 

    } 

    void DesaturizePsyco() 
    { 
     if (spriteRendererPsyco1.sprite == sprite1) // if the spriteRenderer sprite = sprite1 then change to sprite2 
     { 
      GameObject.Find ("PlayerFirst").GetComponent<SpriteRenderer>().sprite = sprite2; 
     } 
     else 
     { 
      spriteRendererPsyco1.sprite = sprite1; // otherwise change it back to sprite1 
     } 
    } 

} 
+0

是你的问题解决了吗?如果是这样,如果你使用张贴的答案解决它,请考虑选择它作为正确的答案。 – Kardux

回答

0

第一次尝试后总是最小剥离脚本:这里的changeCharacterBtn()方法不实用(我建议您的文章编辑的话)。在if (script2.enabled = !script2.enabled;)还有一个错字。另外我猜你的代码在播放时会抛出错误:你是否检查了控制台

关于你的脚本,这里是我看到的错误:

  • spriteRendererPsyco1 = GetComponent<SpriteRenderer>();而不是spriteRendererPsyco1 = Psyco1.GetComponent<SpriteRenderer>();(同为Psyco2)
  • script1script2spriteRendererPsyco1spriteRendererPsyco2应该因为你引用它们设置为私有在Start()(不需要它们出现在Inspector上)

所以这里是你的脚本的一个修正版本:

public class switchCharacter : MonoBehaviour 
{ 
    public GameObject Psyco1; 
    public GameObject Psyco2; 
    private PlayerControllerPsyco1 script1; 
    private PlayerControllerPsyco1 script2; 
    public Sprite sprite1; // Psyco1 color 
    public Sprite sprite2; // Psyco2 decolorized 
    private SpriteRenderer spriteRendererPsyco1; 
    private SpriteRenderer spriteRendererPsyco2; 

    void Start() 
    { 
     script1 = Psyco1.GetComponent<PlayerControllerPsyco1>(); 
     script2 = Psyco2.GetComponent<PlayerControllerPsyco1>(); 
     script1.enabled = true; 
     script2.enabled = false; 
     spriteRendererPsyco1 = Psyco1.GetComponent<SpriteRenderer>(); 
     spriteRendererPsyco2 = Psyco2.GetComponent<SpriteRenderer>(); 
     if(spriteRendererPsyco1.sprite == null) // if the sprite on spriteRenderer is null then 
      spriteRendererPsyco1.sprite = sprite1; // set the sprite to Psyco1 Color 
    } 

    void Update() 
    { 
     if(Input.GetButtonDown("switch1")) 
     { 
      script1.enabled = !script1.enabled; 
      script2.enabled = !script2.enabled; 
      //spriteRendererPsyco1.sprite = sprite2; 
      DesaturizePsyco(); // call method to change Psyco sprite 
     } 
    } 

    void DesaturizePsyco() 
    { 
     if(spriteRendererPsyco1.sprite == sprite1) // if the spriteRenderer sprite = sprite1 then change to sprite2 
     { 
      GameObject.Find("PlayerFirst").GetComponent<SpriteRenderer>().sprite = sprite2; 
     } 
     else 
     { 
      spriteRendererPsyco1.sprite = sprite1; // otherwise change it back to sprite1 
     } 
    } 
} 

作为一个侧面说明,这里有关于通用编程几件事情建议:

  • 考虑使用大写字母开始的类名(这是在C#中的一般性公约)
  • 使用精灵比较以确定哪个播放器当前处于运行状态可能不是最稳健的方式(可以考虑使用bool变量)
  • 始终尝试将代码保留为空一个地(没有双空格,使用大写字母或不保持相同的命名约定:Psyco1script1,...)

希望这有助于

+0

这没有改变脚本的状态,问题依然存在。 –

+0

好吧,我尝试了脚本,因为我用2 _GameObjects_发布了它,每个包含一个_SpriteRenderer_组件(并且一个名为_PlayerFirst_)。它的工作完美。你确定所有的字段都在Inspector中分配吗?控制台中是否显示任何错误? – Kardux