【问题标题】:Change the UI image using script in unity c#在统一 c# 中使用脚本更改 UI 图像
【发布时间】:2018-03-21 03:10:02
【问题描述】:

我想以随机顺序更改 UI 图像。我在 UI(canvas) 中有一个包含 Image 组件 的游戏对象,它最初有 null image。我附加了一个脚本(游戏对象)来在运行时更改图像。

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

public class changeImg : MonoBehaviour {

public Sprite sprite1;
public Sprite sprite2;
public Sprite sprite3;

void Start()
  {
   ChangeImg();
  }
void ChangeImg()
   {
      int rand=Random.Range(0,3);
      if(rand==0)
        {
         gameObject.GetComponent<Image> ().sprite = sprite1;
        //gameObject.GetComponent<UnityEngine.UI.Image> ().sprite = sprite1;
         }
       else if(rand==1)
        {
         gameObject.GetComponent<Image> ().sprite = sprite2;
       // gameObject.GetComponent<UnityEngine.UI.Image> ().sprite = sprite2;
         }
       else if(rand==2)
        {
         gameObject.GetComponent<Image> ().sprite = sprite3;
       //gameObject.GetComponent<UnityEngine.UI.Image> ().sprite = sprite3;
         }
   }
}

我已经在检查器中分配了公共字段 (sprite1,sprite2,sprite3)。正如我在代码中评论的那样,我尝试了这两个选项。我没有收到错误,但图像也没有按照我的意愿进行更改。 在程序运行期间,GameObject(脚本所附加的)最初的图像源为空。

【问题讨论】:

  • 您的代码对我有用。请提供对象检查器的屏幕截图,以便我清楚地了解发生了什么。
  • 是的,它也适用于我。你确定你已经在检查器中为这三个精灵分配了一个值吗?
  • 或者你确定附上了脚本?如果该对象上没有 Image,您将得到一个空引用异常,如果没有错误,则可能没有运行任何代码。进行调试检查。
  • 您是否尝试过附加调试器来查看精灵字段的值?

标签: c# unity3d


【解决方案1】:

使用overrideSprite 字段而不是sprite - documentation

不幸的是,unity ui 充满了这样的陷阱,它的 api 完全违反直觉,所以你必须小心并定期检查文档

【讨论】:

  • 他的代码按原样工作。我认为他的问题出在另一个地方。
  • 嗯,我只是想我记得有同样的问题,overrideSprite 做到了。让我们看看 op 怎么说
  • @Dunno 谢谢,我使用 overrideSprite 更改了图像。上面提到的代码略有变化,如下所示: gameObject.GetComponent ().overrideSprite = sprite1; 我对其他两个精灵进行了类似的更改。而且效果很好。
  • 好的,现在我想知道为什么 OP 的代码对我有效,但对他无效。有什么不同?
  • @Dunno 它对我有用,即使已经有另一个精灵。我一直只是简单地使用 Image.sprite 在运行时更改 UI 精灵。
【解决方案2】:

如果您在 Unity 2017.3 中,也可以只使用 Image(不确定这是否适用于旧版本)。例如:

using UnityEngine.UI;
-----
public Image ObjectwithImage;
public Sprite spriteToChangeItTo;

void Start () {
        ObjectwithImage.sprite = spriteToChangeItTo;
    }

非常适合我。

【讨论】:

    【解决方案3】:

    你检查过游戏对象的位置吗?还有图片的颜色?

    【讨论】:

      【解决方案4】:

      要从Button 更改Image,请不要使用GetComponent&lt;Image&gt; (),因为您可能会得到另一个不属于该按钮的Image 组件。如果对象被禁用,它也可以返回null

      请改用Button.image.spriteButton.image.overrideSprite 变量。

      public Button pb;
      public Sprite newSprite;
      
      void Start()
      {
          pb.image.sprite = newSprite; 
      }
      

      或者

      pb.image.overrideSprite = newSprite; 
      

      真的使用哪一个无关紧要。这两个中的任何一个都应该工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-12
        • 1970-01-01
        • 2021-06-23
        • 2016-09-03
        • 2017-12-18
        • 1970-01-01
        • 2019-05-17
        相关资源
        最近更新 更多