为什么获胜';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;
}
}
无论出于什么原因,我都无法在运行时更改较大精灵的图像,但当我停止运行程序时,较大精灵会更改为我单击的最后一个较小精灵的图像。
好吧,因为我还没有在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()
中,我们基本上说:
如果你点击我的
把大卡片做成和我一样!我还没有测试过,所以线路可能有点偏离,但这个想法是存在的。
总而言之,这是一个附加到您的小卡片对象上的脚本。就像我说的,我还没有测试过,但我认为这个想法是存在的。
希望这能有所帮助!:)