为什么获胜';t我的精灵在运行时更改

本文关键字:精灵 运行时 我的 获胜 为什么 | 更新日期: 2023-09-27 18:22:20

在我的统一场景视图中,我设置了三个游戏对象,每个对象都有各自的精灵渲染器和精灵。三个中的两个尺寸比第三个小。

两个较小的精灵显示的图像不同。我想做的是能够通过点击另外两个来更改第三个的精灵。单击其中一个较小的精灵将使第三个较大的精灵与之前单击的小精灵相匹配。

以下是分配给两个较小精灵的相关脚本。

第一个处理小精灵上显示的精灵:

public class CardModel : MonoBehaviour
{
    SpriteRenderer spriteRenderer;  // renders sprite
    public int cardIndex;       // indicates what the card is
    public bool show;           // shows or hides card
    public Sprite[] cardFronts; // collection of cards' front sides
    public Sprite cardBack;     // backside of all cards
    // if card is turned up, show front of card, show back otherwise
    public void DisplaySprite()
    {
        if (show)
            spriteRenderer.sprite = cardFronts[cardIndex];
        else
            spriteRenderer.sprite = cardBack;
    }
    void Awake()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();    // retrieve our sprite renderer
        DisplaySprite();                                         // show card's sprite
    }
}

第二个使较小的精灵可以点击:

public class ClickCard : MonoBehaviour
{
    CardModel model; // used to retrieve card index and bool to assign to larger sprite
    public GameObject largeSprite; // third large sprite
    void OnMouseDown()
    {
        CardModel cModel = GetComponent<CardModel>(); // retrieve card model from smaller sprite
        LargeCardModel largeCardModel = largeSprite.GetComponent<LargeCardModel>(); // retrieve card model for larger sprite
        largeCardModel.matchSprite(cModel.show, cModel.cardIndex); // match large sprite with small sprite clicked
    }
}

最后,附在第三个大精灵上的脚本:

public class LargeCardModel : MonoBehaviour
{
    public int largeIndex; // determines which sprite to show
    public Sprite[] largeCardFaces; // collection of large sprites
    public Sprite largeCardBack; // large card back
    SpriteRenderer largeRenderer; // renders the image upon the large sprite
    void Awake()
    {
        largeRenderer = GetComponent<SpriteRenderer>(); // retrieve renderer
    }
    // method to allow sprite to be changed
    public void matchSprite(bool showFace, int cIndex)
    {
        if (largeRenderer == null)
            largeRenderer = GetComponent<SpriteRenderer>(); // for some reason, I need to include this line or else I get an exception
        if (showFace)
            largeRenderer.sprite = largeCardFaces[cIndex];
        else
            largeRenderer.sprite = largeCardBack;
    }
}

无论出于什么原因,我都无法在运行时更改较大精灵的图像,但当我停止运行程序时,较大精灵会更改为我单击的最后一个较小精灵的图像。

为什么获胜';t我的精灵在运行时更改

好吧,因为我还没有在Unity中测试过。

我认为你试图做的事情过于复杂了。你想要的基本上是当精灵1或2被点击时,精灵3就会变成你刚刚点击的东西。

这里有一个尝试的想法:

小型卡游戏对象:

public int cardIndex;       // indicates what the card is
public bool show;           // shows or hides card
public Sprite[] cardFronts; // collection of cards' front sides
public Sprite cardBack;     // backside of all cards
GameObject largeSprite;     //the large sprite that we will be changing!
void Start()
{
    largeSprite = GameObject.Find("Name of the large sprite"); //find our large sprite!
}

// if card is turned up, show front of card, show back otherwise
public void DisplaySprite()
{
    if (show)
        gameObject.sprite = cardFronts[cardIndex]; //or it could be gameObject.renderer.sprite, I havent tested!
    else
        gameObject.sprite = cardBack;
}
void Awake()
{
    DisplaySprite(); // show card's sprite
}
void OnMouseDown()
{
    largeSprite.sprite = gameObject.sprite; //make the large one have the same as the small one!
}

说明:

假设这是有效的,我已经从大的GameObject中完全删除了脚本,并将两个脚本合并到了小的一个中。

Start()中,我们使用GameObject.Find()找到大型纸牌游戏对象,这样Unity就会找到具有您提供的名称的对象,并从那里开始。

OnMouseDown()中,我们基本上说:

  • 如果你点击我的

  • 把大卡片做成和我一样!我还没有测试过,所以线路可能有点偏离,但这个想法是存在的。

总而言之,这是一个附加到您的小卡片对象上的脚本。就像我说的,我还没有测试过,但我认为这个想法是存在的。

希望这能有所帮助!:)