首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >触摸“统一2D”按钮时更改玩家的精灵

触摸“统一2D”按钮时更改玩家的精灵
EN

Stack Overflow用户
提问于 2017-02-16 00:26:23
回答 1查看 1.2K关注 0票数 0

我想在一个场景中改变玩家的精灵。我有一个脚本,可以管理当您从一个播放器切换到另一个播放器时,哪个脚本被激活。我想增加一个功能,当切换不活跃的玩家变得黑白,锻造一个精灵和活跃的玩家对有色的雪碧。谁能帮上忙,因为第一位玩家和第二位玩家GameObject上没有改变精灵?

以下是代码:

代码语言:javascript
复制
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
        }
    }

}
EN

回答 1

Stack Overflow用户

发布于 2017-02-16 09:40:00

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

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

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

下面是您的脚本的更正版本:

代码语言:javascript
复制
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#中的一般惯例)
  • 使用Sprites比较来确定哪个播放器当前运行可能不是最健壮的方法(也许可以考虑使用bool变量)
  • 始终尽量保持代码的整洁(不使用双空格,是否使用大写字母保持相同的命名约定:Psyco1script1,.)

希望这能帮上忙

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42262641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档