gpt4 book ai didi

unity3d - 将 Unity 可编写脚本的对象附加到 GameObject

转载 作者:行者123 更新时间:2023-12-05 05:08:34 25 4
gpt4 key购买 nike

我已经学习 Unity 教程大约两周了,我已经做了一些非常基础的东西。很抱歉,如果这是一个 super 简单的问题,但我花了最后 5 个小时来解决这个问题并决定来这里。

到目前为止我做了什么:

我制作了一款非常基本的纸牌游戏,其中纸牌具有攻击力和生命值等属性。这些值存储在每张卡片的 ScriptableObject 中。

[CreateAssetMenu(fileName = "New Card", menuName = "Card")]
public class Card : ScriptableObject
{
public int instanceNumber;
public bool isDefaultCard = false;

public string cardName;
public string description;
public string flavorText;

public Sprite cardArt;

public int manaCost;
public int health;
public int attack;

public int characterClass;


public void printCardData()
{
Debug.Log(cardName + ": " + description);
}
}

现在我还有一个卡片预制件,在 Unity UI 上我可以将预制件拖到场景中,然后将我的 ScriptableObject 拖到卡片显示脚本中,它会更新卡片并显示一切正常!

不过,我这辈子都想不出如何用代码来做到这一点。我不知道如何从代码访问我的 ScriptableObjects。

我知道我可以用这样的东西实例化一个预制件:

Instantiate(myPrefab, new Vector3(0, 0, 0), Quaternion.identity);

但是我该如何添加我的卡数据呢?我希望游戏在战斗结束时有奖励,每次都会显示随机选择的卡片,你可以选择一张。所以这意味着创建 3 个卡片对象,它们附加了一个随机的 ScriptableObject。但同样,无论我尝试什么,我似乎都无法找到从代码访问我的 ScriptableObjects。

如果这太简单了,再次抱歉,但我很迷茫。我需要一种方法来随时创建我的任何 ScriptableObjects 卡的对象。玩家将有很多次将更多卡片添加到他们的牌组中,但他们的牌组一次只有 20-30 张牌。

最佳答案

所以您有一个 Monobehaviour CardDisplayScript 和一个 ScriptableObject Card。在此之前的其他 2 条评论提到了单例和奖励卡列表。虽然它们都可以解决问题,但我使用略有不同的设计取得了成功。我的方法允许敌人共享一个“共同的奖励池”,并在死亡时从那个共同的池中撤出。对于 Boss 或稀有敌人,我喜欢创建一个略有不同的“Boss 奖励池”。

此设计需要 4 个脚本:

卡片脚本对象

正如您在问题中所说:

[CreateAssetMenu(fileName = "New Card", menuName = "Card")]
public class Card : ScriptableObject
{
public int instanceNumber;
public bool isDefaultCard = false;

public string cardName;
public string description;
public string flavorText;

public Sprite cardArt;

public int manaCost;
public int health;
public int attack;

public int characterClass;


public void printCardData()
{
Debug.Log(cardName + ": " + description);
}
}

CardRewardPool ScriptableObject

[CreateAssetMenu(fileName = "DefaultRewardPool", menuName = "Card Reward Pool")]
public class CardRewardPool : ScriptableObject
{
public List<Card> cards;

public Card GetRandomCard()
{
if(cards.Count > 0)
return cards[Random.Range(0,cards.Count)];
else
return null;
}
}

如果奖励池可能为空,您应该首先检查列表中是否有卡片来处理此问题(如上面的代码所示)。如果奖励池永远不应该为空,那么您可以删除“if”检查并适本地处理列表为空时的错误。

CardDisplayScript 单一行为

public class CardDisplayScript : Monobehaviour
{
public Card card;
//... other properties
public void UpdateCard(Card _card)
{
card = _card;
//... reload in game attributes using the new card
}
}

LootableEntity 单一行为

此脚本可以附加到任何可能奖励卡牌(敌人、奖励宝箱、故事奖励等)的东西上。在这种情况下,如果战斗结束,那么您刚刚击败的任何敌人都应该附加一个“LootableEntity”(如果您愿意,也可以是其他名称),它直接引用可以产生奖励的奖励池。

public class LootableEntity : Monobehaviour
{
public CardRewardPool cardRewardPool;

public Card GetBattleReward()
{
return cardRewardPool.GetRandomCard();
}
}

最后的评论

这种设计允许您为每个敌人分配一个独特的奖励池,或者让一些敌人共享一个奖励池。如果您不想将您的卡片分成不同的奖励池,您可以拥有一个具有相同设计的通用奖励池。此外,您不再需要在每个实体上保留一个 ScriptableObjects 列表,因此您确实节省了一些内存。

关于unity3d - 将 Unity 可编写脚本的对象附加到 GameObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58207967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com