代码之家  ›  专栏  ›  技术社区  ›  Aldrin Ramirez

使用不同副本访问Unity中的游戏对象

  •  2
  • Aldrin Ramirez  · 技术社区  · 9 年前

    我正在我的RPG(角色电镀游戏)中创建一个任务系统,它可以通过NPC(非玩家角色)获得。我在我的主角身上附上了一个脚本,可以检查你是否获得了NPC的任务。代码如下:

    public class QuestTracker : MonoBehaviour
    {
        public QuestGiver questGiver;
        public Button AcceptQuest;
        public OpenQuestWindow questWindow;
    
        public void acceptQuest()
        {
            questGiver.questAccepted = true;
        }
    }
    

    现在我在NPC上附上了一个脚本,让他们给玩家一个任务。以下是NPC的代码:

     public class QuestGiver : MonoBehaviour
     {
        public bool questAccepted = false;
     }
    

    当玩家点击NPC时,会出现一个窗口,显示玩家的任务目标。目前,我已经创建了两个NPC,并将它们都附加到QuestGiver脚本中。下面是一些截图:

    enter image description here enter image description here

    在accept按钮上,我在连接到播放器的QuestTracker上使用了acceptQuest()函数,但我无法为QuestGiver设置特定值,因为我有多个NPC副本,而不是一个。

    enter image description here

    我想要的是通过运行时在播放器上设置QuestGiver。我知道它可以通过使用OnMouseOver()函数或Raycast来实现。我知道逻辑,但不知道如何实现。

    2 回复  |  直到 9 年前
        1
  •  2
  •   Cenkisabi    9 年前

    我认为使用静态变量可以解决问题。将玩家questGiver设置为静态。

    public class QuestTracker : MonoBehaviour
    {
        public static QuestGiver questGiver;
        public Button AcceptQuest;
        public OpenQuestWindow questWindow;
    
        public void acceptQuest()
        {
            questGiver.questAccepted = true;
        }
    }
    

    然后,当Npc进行任务时,通过Npc的脚本更改玩家的questGiver。

    void OnMouseDown()
    {
        QuestTracker.questGiver = this;
    }
    

    编辑:顺便说一下,当您将questGiver变量更改为静态时,您将不会在检查器中看到它。使用Debug.Log()测试它。

        2
  •  0
  •   Yytsi    9 年前

    你应该制作一个游戏中所有QuestGiver的数组,并在任何脚本的Start()函数上分配它们的值。向QuestGiver类添加一个全局变量,以标识QuestGier是谁,例如整数就可以。将此代码放入acceptQuest()

    QuestGiver giver = null;
    switch (questGiver.ID)
    {
        case 0:
        giver = classThatHasTheArray.QuestGiverArray[0];
        break;
    }
    
    giver.questAccepted = true;
    

    此致,TuukkaX。