触摸按钮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
}
}
}

首先尝试始终发布一个最小的剥离脚本:在这里,changeCharacterBtn()方法没有用(我已经建议对您的帖子进行编辑)。在if (script2.enabled = !script2.enabled;)这里还有一个错字.另外,我想您的代码在播放时会抛出错误:您是否检查了控制台

关于您的脚本,以下是我看到的错误:

  • spriteRendererPsyco1 = GetComponent<SpriteRenderer>();而不是spriteRendererPsyco1 = Psyco1.GetComponent<SpriteRenderer>();(与 Psyco2 相同)
  • script1script2spriteRendererPsyco1spriteRendererPsyco2应设置为私有,因为您在Start()中引用它们(无需它们出现在检查器上)

因此,这是脚本的更正版本:

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,...

希望这有帮助,

最新更新