为什么在运行时改变我的精灵变化?

时间:2015-11-17 07:04:47

标签: c# unity3d sprite

在我团结的场景视图中,我设置了三个游戏对象,每个游戏对象都有一个相应的精灵渲染器和精灵。三个中的两个尺寸小于第三个尺寸。

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

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

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

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;
    }
}

无论出于何种原因,我无法在运行时将图像更改为更大的精灵,但是当我停止运行程序时,大精灵会变为我点击的最后一个较小精灵的精灵。

1 个答案:

答案 0 :(得分:0)

好的,因为我已经 在Unity中对此进行了测试。

我认为你已经过度复杂了你想要做的事情。你想要的是基本上当点击精灵1或2时,精灵3变成你刚刚点击的颜色。

这是一个尝试尝试的想法:

Small Card GameObject:

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()我们基本上说:

  • 如果你点击我

  • 让大卡和我一样!我没有对它进行过测试,以便该线可能有点偏离,但这个想法就在那里。

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

希望这有帮助! :)