我们的游戏世界(背包【仓库】,交易,任务,简单经济系统,装备)实现(基于仙剑demo聊聊游戏世界)第二篇谈谈任务

本文详细介绍了游戏开发中的任务系统实现与管理方法,包括NPC脚本编写、任务对话窗口设计、背包物品检查及任务状态跟踪等关键环节。通过实例代码展示了如何利用Unity引擎进行任务系统的构建,实现玩家与NPC之间的互动,以及任务状态的动态更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务系统是对于仙剑游戏来说说并不陌生,从一代李逍遥婶婶的500块钱到现在跟魔兽世界一样的任务接续流程,已经过去了很多代,不过任务和剧情对于游戏来说却是始终不能缺少的,我们的仙剑demo也一样,我在前面讲插件的时候就讲解过任务系统的制作(比我们demo中使用的任务系统要强大很多),我们这里因为仙剑不是一个太注重任务的游戏,所以占时不使用太复杂的任务系统了,我们看下我们的仙剑demo任务是怎么做的

在npc身上挂载的脚本就是这样,我们看下代码

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class NpcSetup : MonoBehaviour {
	
	public enum NameTagSetup {NpcName,PlayerName,Other};
	public enum NpcType {RegularNpc,ShopKeeper,QuestNpc,SaveNpc};
	public enum FaceSetup {NpcFace,PlayerFace,Other};
	
	public enum QuestNpcState{StartQuest,InProgress,Complete,AfterComplete};
	
	public NpcType npcType;
	
	public string npcName;
	public Texture2D npcFace;
	
	private bool startCountDialogBox;
	
	[System.Serializable]
	public class MessageBoxSetting
	{
		public bool enableNameTag = true;
		public NameTagSetup nameTagSetup;
		public string otherNameTag;
		public bool enableFace = true;
		public FaceSetup faceSetup;
		public Texture2D otherFace;
		[Multiline]
		public string message;
		
	}
	
	
	public List<MessageBoxSetting> dialogSetting = new List<MessageBoxSetting>();
	
	public int questID;
	public QuestNpcState questNpcState;
	
	public List<MessageBoxSetting> dialogQuest = new List<MessageBoxSetting>();
	public List<MessageBoxSetting> dialogQuestInProgress = new List<MessageBoxSetting>();
	public List<MessageBoxSetting> dialogQuestComplete = new List<MessageBoxSetting>();
	public List<MessageBoxSetting> dialogQuestAfterComplete = new List<MessageBoxSetting>();
	
	private HeroController playerControl;
	private int indexDialog;
	private int indexCurrentQuest;
	private bool disableMovePlayer;
	private Quest_Data questData;
	private QuestWindow questWindow;
	public GUI_Menu inventory;
	private GameObject player;
	
	
	public static bool resetMessageBox;
	
	public static bool disableNext;
	
	//Editor Variable
	[HideInInspector]
	public int sizeDialog=0;
	[HideInInspector]
	public int sizeDialogQuest=0;
	[HideInInspector]
	public int sizeDialogQuestInProgress=0;
	[HideInInspector]
	public int sizeDialogQuestComplete=0;
	[HideInInspector]
	public int sizeDialogQuestAfterComplete=0;
	[HideInInspector]
	public List<bool> showSizeDialog = new List<bool>();
	[HideInInspector]
	public List<bool> showSizeDialogQuest = new List<bool>();
	[HideInInspector]
	public List<bool> showSizeDialogQuestInProgress = new List<bool>();
	[HideInInspector]
	public List<bool> showSizeDialogQuestComplete = new List<bool>();
	[HideInInspector]
	public List<bool> showSizeDialogQuestAfterComplete = new List<bool>();
	

	// Use this for initialization
	void Start () {
		
		// Change this tag to Npc
		if(this.tag != "Npc")
			this.tag = "Npc";
		
		if(this.gameObject.layer != 13)
			this.gameObject.layer = 13;
		
		indexDialog = 0;
		
		playerControl = GameObject.FindGameObjectWithTag("Player").GetComponent<HeroController>();
		
		if(npcType == NpcType.QuestNpc)
		{
			questData = GameObject.Find("QuestData").GetComponent<Quest_Data>();
			questWindow = GameObject.Find("GUI Manager/QuestWindow").GetComponent<QuestWindow>();
			player = GameObject.FindGameObjectWithTag("Player");
			inventory = player.transform.FindChild("Inventory").GetComponent<GUI_Menu>();
			
		}
			
		
	
	}
	
	// Update is called once per frame
	void Update () {
		
		if(npcType == NpcType.RegularNpc || npcType == NpcType.ShopKeeper || npcType == NpcType.SaveNpc)
			NpcDetect();
		else if(npcType == NpcType.QuestNpc)
			QuestNpcDetect();
		
	
	}
	
	void NpcDetect()
	{
		if(disableMovePlayer)
			DisableMove();
		
		if(startCountDialogBox)
		{
			SetupDialogBox(indexDialog);
			if(Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.KeypadEnter))
			{
				
				SoundManager.instance.PlayingSound("Next_Dialog");
				
				if(indexDialog < dialogSetting.Count-1)
				{
					indexDialog++;
				}else
				{
					if(npcType == NpcType.ShopKeeper || npcType == NpcType.SaveNpc)
						CallNextCommand();
					
					indexDialog = 0;
					startCountDialogBox = false;
					MessageBox.showMessageBox = false;
					MessageBox.showNameTag = false;
					MessageBox.showFace = false;
					Invoke("EnableMovePlayer",0.3f);
				}
				
				
			}
			
		}	
	}
	
	void QuestNpcDetect()
	{
		if(disableMovePlayer)
			DisableMove();
		
		if(startCountDialogBox)
		{
			if(questNpcState == QuestNpcState.StartQuest)
				SetupDialogBoxQuest(indexDialog,dialogQuest);
			else if(questNpcState == QuestNpcState.InProgress)
				SetupDialogBoxQuest(indexDialog,dialogQuestInProgress);
			else if(questNpcState == QuestNpcState.Complete)
				SetupDialogBoxQuest(indexDialog,dialogQuestComplete);
			else if(questNpcState == QuestNpcState.AfterComplete)
				SetupDialogBoxQuest(indexDialog,dialogQuestAfterComplete);
			 
			
			if(questNpcState == QuestNpcState.StartQuest)
				{
					if(Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.KeypadEnter) || resetMessageBox)
					{
						if(!QuestWindow.enableWindow)
						SoundManager.instance.PlayingSound("Next_Dialog");
					
						if(indexDialog < dialogQuest.Count-1)
						{
							indexDialog++;
							
							if(indexDialog == dialogQuest.Count-1)
							{
								QuestWindow.enableWindow = true;
								QuestWindow.enableButtonAccept = true;
								disableNext = true;
								questWindow.SetupQuestWindow(questID);
							}
								
						
						}else if(!disableNext)
						{	
							disableNext = false;
							indexDialog = 0;
							startCountDialogBox = false;
							MessageBox.showMessageBox = false;
							MessageBox.showNameTag = false;
							MessageBox.showFace = false;
							resetMessageBox = false;
							Invoke("EnableMovePlayer",0.3f);
						}
					}
				}else
			
			
			if(Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.KeypadEnter))
			{
				
				SoundManager.instance.PlayingSound("Next_Dialog");
				
				if(questNpcState == QuestNpcState.InProgress)
				{
					if(indexDialog < dialogQuestInProgress.Count-1)
					{
						indexDialog++;
					}else
					{				
						indexDialog = 0;
						startCountDialogBox = false;
						MessageBox.showMessageBox = false;
						MessageBox.showNameTag = false;
						MessageBox.showFace = false;
						QuestWindow.enableWindow = false;
						Invoke("EnableMovePlayer",0.3f);
					}
				}
					
					
				else if(questNpcState == QuestNpcState.Complete)
				{
					if(indexDialog < dialogQuestComplete.Count-1)
					{
						indexDialog++;
					}else
					{
						if(!questData.questSetting[indexCurrentQuest].repeatQuest)
						{
							questData.questSetting[indexCurrentQuest].questState = 3;
						}else
						{
							questData.questSetting[indexCurrentQuest].questState = 0;
						}
						
						GiveReward(questID);
						indexDialog = 0;
						startCountDialogBox = false;
						MessageBox.showMessageBox = false;
						MessageBox.showNameTag = false;
						MessageBox.showFace = false;
						Invoke("EnableMovePlayer",0.3f);
					}
				}
					
					
				else if(questNpcState == QuestNpcState.AfterComplete)
				{
					if(indexDialog < dialogQuestAfterComplete.Count-1)
					{
						indexDialog++;
					}else
					{				
						indexDialog = 0;
						startCountDialogBox = false;
						MessageBox.showMessageBox = false;
						MessageBox.showNameTag = false;
						MessageBox.showFace = false;
						Invoke("EnableMovePlayer",0.3f);
					}
				}
									
			}
			
		}	
	}
	
	public void DisableMove()
	{
		playerControl.dontMove = true;
		playerControl.dontClick = true;
	}
	
	
	public void CallDialogBox()
	{
		startCountDialogBox = true;
		MessageBox.showMessageBox = true;
		disableMovePlayer = true;
		
	}
	
	void EnableMovePlayer()
	{
		disableMovePlayer = false;
		playerControl.ResetState();
	}
	
	void SetupDialogBox(int i)
	{
		if(dialogSetting[i].enableNameTag)
		{
			if(dialogSetting[i].nameTagSetup == NameTagSetup.PlayerName)
				MessageBox.nameTagStatic = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerStatus>().playerName;
			else if(dialogSetting[i].nameTagSetup == NameTagSetup.NpcName)
				MessageBox.nameTagStatic = npcName;
			else if(dialogSetting[i].nameTagSetup == NameTagSetup.Other)
				MessageBox.nameTagStatic = dialogSetting[i].otherNameTag;
			
			MessageBox.showNameTag = true;
		}else
		{
			MessageBox.showNameTag = false;
		}
		
		if(dialogSetting[i].enableFace)
		{
			if(dialogSetting[i].faceSetup == FaceSetup.PlayerFace)
				MessageBox.faceStatic = GameObject.FindGameObjectWithTag("Player").GetComponent<HeroController>().heroImage;
			else if(dialogSetting[i].faceSetup == FaceSetup.NpcFace)
				MessageBox.faceStatic = npcFace;
			else if(dialogSetting[i].faceSetup == FaceSetup.Other)
				MessageBox.faceStatic = dialogSetting[i].otherFace;
			
			MessageBox.showFace = true;
		}else
		{
			MessageBox.showFace = false;
		}
		
		
		MessageBox.messageStatic = dialogSetting[i].message;
		
	}
	
	void SetupDialogBoxQuest(int i,List<MessageBoxSetting> mBoxQuest)
	{
		if(mBoxQuest[i].enableNameTag)
		{
			if(mBoxQuest[i].nameTagSetup == NameTagSetup.PlayerName)
				MessageBox.nameTagStatic = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerStatus>().playerName;
			else if(mBoxQuest[i].nameTagSetup == NameTagSetup.NpcName)
				MessageBox.nameTagStatic = npcName;
			else if(mBoxQuest[i].nameTagSetup == NameTagSetup.Other)
				MessageBox.nameTagStatic = mBoxQuest[i].otherNameTag;
			
			MessageBox.showNameTag = true;
		}else
		{
			MessageBox.showNameTag = false;
		}
		
		if(mBoxQuest[i].enableFace)
		{
			if(mBoxQuest[i].faceSetup == FaceSetup.PlayerFace)
				MessageBox.faceStatic = GameObject.FindGameObjectWithTag("Player").GetComponent<HeroController>().heroImage;
			else if(mBoxQuest[i].faceSetup == FaceSetup.NpcFace)
				MessageBox.faceStatic = npcFace;
			else if(mBoxQuest[i].faceSetup == FaceSetup.Other)
				MessageBox.faceStatic = mBoxQuest[i].otherFace;
			
			MessageBox.showFace = true;
		}else
		{
			MessageBox.showFace = false;
		}
		
		
		MessageBox.messageStatic = mBoxQuest[i].message;
		
	}
	
	void CallNextCommand()
	{
		if(npcType == NpcType.ShopKeeper)
		{
			GUI_Menu.instance.CallShop(this.gameObject);
			
		}else if(npcType == NpcType.QuestNpc)
		{
			
		}else if(npcType == NpcType.SaveNpc)
		{
			GUI_Menu.instance.CallSaveWindow(this.gameObject);
		} 
	}
	
	public void SetupDialogQuest(int id)
	{
		for(int i=0;i<questData.questSetting.Count;i++)
		{
			if(questID == questData.questSetting[i].questID)
			{
				
				if(questData.questSetting[i].questState == 1)
					CheckConditionQuest(id);
				
				if(questData.questSetting[i].questState == 0)
				{
					questNpcState = QuestNpcState.StartQuest;
					
					if(indexDialog == dialogQuest.Count-1)
					{
						QuestWindow.enableWindow = true;
						QuestWindow.enableButtonAccept = true;
						disableNext = true;
						questWindow.SetupQuestWindow(questID);
					}
					
				}else if(questData.questSetting[i].questState == 1)
				{
					questNpcState = QuestNpcState.InProgress;
					questWindow.SetupQuestWindow(questID);
					QuestWindow.enableWindow = true;
				}else if(questData.questSetting[i].questState == 2)
				{
					questNpcState = QuestNpcState.Complete;
				}else if(questData.questSetting[i].questState == 3)
				{
					questNpcState = QuestNpcState.AfterComplete;
				}
				
				indexCurrentQuest = i;
				
				break;	
			}
		}
	}
	
	void CheckConditionQuest(int id)
	{
		for(int i=0;i<questData.questSetting.Count;i++)
		{
			if(questID == questData.questSetting[i].questID)
			{
				if(questData.questSetting[i].questCondition == Quest_Data.QuestCondition.Hunting)
				{
					if(questData.questSetting[i].killCount >= (int)questData.questSetting[i].idCondition.y)
					{
						questData.questSetting[i].killCount = 0;
						questData.questSetting[i].questState = 2;
					}
				}else
				{
					if(CheckConditionItem((int)questData.questSetting[i].idCondition.x,(int)questData.questSetting[i].idCondition.y))
					{
						questData.questSetting[i].killCount = 0;
						questData.questSetting[i].questState = 2;
					}
				}
				
				
				break;	
			}
		}
	}
	
	bool CheckConditionItem(int id,int amout)
	{
		for(int i =0;i<inventory.bag_item.Count;i++)
		{
			if(inventory.bag_item[i].item_id == id && inventory.bag_item[i].item_amount >= amout)
			{
				inventory.bag_item[i].item_amount -= amout;
				
				if(inventory.bag_item[i].item_amount <= 0)
				{
					inventory.bag_item[i].item_id = 0;	
				}
				
				return true;
			}
		}
		
		return false;
	}
	
	void GiveReward(int id)
	{
		for(int i=0;i<questData.questSetting.Count;i++)
		{
			if(questID == questData.questSetting[i].questID)
			{
				inventory.GiveItem((int)questData.questSetting[i].itemIDReward.x,(int)questData.questSetting[i].itemIDReward.y);
				Debug.Log("Give");
				break;	
			}
		}
	}
}
代码很简单,

if(npcType == NpcType.QuestNpc)
		{
			questData = GameObject.Find("QuestData").GetComponent<Quest_Data>();
			questWindow = GameObject.Find("GUI Manager/QuestWindow").GetComponent<QuestWindow>();
			player = GameObject.FindGameObjectWithTag("Player");
			inventory = player.transform.FindChild("Inventory").GetComponent<GUI_Menu>();
			
		}

看这里,加载任务控制器模块之后,加载任务对话窗口,判断是不是玩家化身play发出的指令,如果是的话,那么找寻背包中是否有任务需要的物品,看下各个模块代码

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Quest_Data : MonoBehaviour {
	
	public enum QuestCondition {Hunting,Collect};
	
	[System.Serializable]
	public class QuestSetting
	{
		public string questName;
		public int questID;
		[Multiline]
		public string questDetail;
		public QuestCondition questCondition;
		public Vector2 idCondition;
		public Vector2 itemIDReward;
		public bool repeatQuest;
		
		[HideInInspector]
		public int killCount;
		
		[HideInInspector]
		public int questState = 0;
		
		[HideInInspector]
		public bool isStart;
	}
	
	public List<QuestSetting> questSetting = new List<QuestSetting>();
	
	
	//Editor Variable
	[HideInInspector]
	public int sizeQuest=0;
	[HideInInspector]
	public List<bool> showSizeQuest = new List<bool>();

	
	public void StartQuest(int id)
	{
		for(int i = 0;i<questSetting.Count;i++)
		{
			if(id == questSetting[i].questID)
			{
				questSetting[i].isStart = true;
				questSetting[i].questState = 1;
			}
		}
	}
	
	public void SaveQuest()
	{
		for(int i = 0;i<questSetting.Count;i++)
		{
			PlayerPrefs.SetInt("qKillCount"+i,questSetting[i].killCount);
			PlayerPrefs.SetInt("qQuestState"+i,questSetting[i].questState);
			PlayerPrefs.SetInt("qIsStart"+i,questSetting[i].isStart ? 1:0);
		}
	}
	
	public void LoadQuest()
	{
		for(int i = 0;i<questSetting.Count;i++)
		{
			questSetting[i].killCount = PlayerPrefs.GetInt("qKillCount"+i,questSetting[i].killCount);
			questSetting[i].questState = PlayerPrefs.GetInt("qQuestState"+i,questSetting[i].questState);
			questSetting[i].isStart = PlayerPrefs.GetInt("qIsStart"+i) == 1 ? true : false;
		}
		
	}
	
}

using UnityEngine;
using System.Collections;

public class QuestWindow : MonoBehaviour {

	[System.Serializable]
	public class GUISetting
	{
		public Vector2 position;
		public Vector2 size;
		public Texture2D texture;
	}
	
	[System.Serializable]
	public class ButtonSetting
	{
		public Vector2 position;
		public Vector2 size;
		public GUIStyle buttonStlye;
	}
	
	[System.Serializable]
	public class LabelSetting
	{
		public Vector2 position;
		public GUIStyle style;
		public bool enableStroke;
		public Color strokeColor;
	}
	
	private Vector2 defaultScreenRes; //Screen Resolution
	
	public GUISetting questWindow; //window setting
	public ButtonSetting buttonAccept,buttonCancel; //button setting
	
	public LabelSetting titleFont,detailFont,rewardLabel,itemNameFont,targetLabel,targetFont;
	
	[HideInInspector]
	public HeroController controller; //script controller
	
	public static bool enableWindow; //check enable/disable window
	public static bool enableButtonAccept; // check enable/disable accept button
	
	private Quest_Data questData;
	private Item_Data itemData;
	private Monster_Data monsterData;
	
	[Multiline]
	public static string detailQuest;
	public static string titleQuest;
	public static Vector2 condition;
	public static Vector2 reward;
	
	private int questID;
	private string itemRewardName;
	private string conditionName;
	
	// Use this for initialization
	void Start () {
		
		enableWindow = false;
		defaultScreenRes.x = 1920; //declare max screen ratio
		defaultScreenRes.y = 1080; //declare max screen ratio
		
		GameObject go = GameObject.FindGameObjectWithTag("Player");  //Find player
		controller = go.GetComponent<HeroController>();
		
		questData = GameObject.Find("QuestData").GetComponent<Quest_Data>();
		itemData = GameObject.Find("Item_Data").GetComponent<Item_Data>();
		monsterData = GameObject.Find("MonsterData").GetComponent<Monster_Data>();
	}
	
	void OnGUI()
	{
		// Resize GUI Matrix according to screen size
        ResizeGUIMatrix();
		
		if(enableWindow)
		{
			if(!controller.dontMove)
				controller.dontMove = true;
			
			//Draw window
			GUI.DrawTexture(new Rect(questWindow.position.x,questWindow.position.y,questWindow.size.x,questWindow.size.y),questWindow.texture);
		
			if(enableButtonAccept)
			{
				//Draw accept button
				if(GUI.Button(new Rect(buttonAccept.position.x,buttonAccept.position.y,buttonAccept.size.x,buttonAccept.size.y),"",buttonAccept.buttonStlye))
				{
					SoundManager.instance.PlayingSound("Accept_Quest");
					NpcSetup.resetMessageBox = true;
					NpcSetup.disableNext = false;
					MessageBox.showMessageBox = false;
					MessageBox.showNameTag = false;
					MessageBox.showFace = false;
					questData.StartQuest(questID);
					controller.dontMove = false;
					controller.dontClick = false;
					enableButtonAccept = false;
					enableWindow = false;
					
				}
			
				//Draw cancel button
				if(GUI.Button(new Rect(buttonCancel.position.x,buttonCancel.position.y,buttonCancel.size.x,buttonCancel.size.y),"",buttonCancel.buttonStlye))
				{
					NpcSetup.resetMessageBox = true;
					MessageBox.showMessageBox = false;
					MessageBox.showNameTag = false;
					MessageBox.showFace = false;
					NpcSetup.disableNext = false;
					controller.dontMove = false;
					enableButtonAccept = false;
					enableWindow = false;
				}
			}
			
			
			
			//Title Quest
			if(titleFont.enableStroke)
			TextFilter.DrawOutline(new Rect(titleFont.position.x ,titleFont.position.y, 1000 , 1000)
				,titleQuest,titleFont.style,titleFont.strokeColor,titleFont.style.normal.textColor,2f);
			else
				GUI.Label(new Rect(titleFont.position.x ,titleFont.position.y, 1000 , 1000),titleQuest,titleFont.style);
			
			//Detail Quest
			if(detailFont.enableStroke)
			TextFilter.DrawOutline(new Rect(detailFont.position.x ,detailFont.position.y, 1000 , 1000)
				,detailQuest,detailFont.style,detailFont.strokeColor,detailFont.style.normal.textColor,2f);
			else
				GUI.Label(new Rect(detailFont.position.x ,detailFont.position.y, 1000 , 1000),detailQuest,detailFont.style);
			
			//Target Label
			if(targetLabel.enableStroke)
			TextFilter.DrawOutline(new Rect(targetLabel.position.x ,targetLabel.position.y, 1000 , 1000)
				,"Target",targetLabel.style,targetLabel.strokeColor,targetLabel.style.normal.textColor,2f);
			else
				GUI.Label(new Rect(targetLabel.position.x ,targetLabel.position.y, 1000 , 1000),"Target",targetLabel.style);
			
			//Target
			if(targetFont.enableStroke)
			TextFilter.DrawOutline(new Rect(targetFont.position.x ,targetFont.position.y, 1000 , 1000)
				,condition.y.ToString() + " x " + conditionName,targetFont.style,targetFont.strokeColor,targetFont.style.normal.textColor,2f);
			else
				GUI.Label(new Rect(targetFont.position.x ,targetFont.position.y, 1000 , 1000),condition.y.ToString() + " x " + conditionName,targetFont.style);
			
			
			//Reward Label
			if(rewardLabel.enableStroke)
			TextFilter.DrawOutline(new Rect(rewardLabel.position.x ,rewardLabel.position.y, 1000 , 1000)
				,"Reward",rewardLabel.style,rewardLabel.strokeColor,rewardLabel.style.normal.textColor,2f);
			else
				GUI.Label(new Rect(rewardLabel.position.x ,rewardLabel.position.y, 1000 , 1000),"Reward",rewardLabel.style);
			
			//Reward
			if(itemNameFont.enableStroke)
			TextFilter.DrawOutline(new Rect(itemNameFont.position.x ,itemNameFont.position.y, 1000 , 1000)
				,reward.y.ToString() + " x " + itemRewardName,itemNameFont.style,itemNameFont.strokeColor,itemNameFont.style.normal.textColor,2f);
			else
				GUI.Label(new Rect(itemNameFont.position.x ,itemNameFont.position.y, 1000 , 1000),reward.y.ToString() + " x " + itemRewardName,itemNameFont.style);
			
		}
		
		// Reset matrix after finish
	        GUI.matrix = Matrix4x4.identity;
	}
	
	void ResizeGUIMatrix()
    {
       // Set matrix
       Vector2 ratio = new Vector2(Screen.width/defaultScreenRes.x , Screen.height/defaultScreenRes.y );
       Matrix4x4 guiMatrix = Matrix4x4.identity;
       guiMatrix.SetTRS(new Vector3(1, 1, 1), Quaternion.identity, new Vector3(ratio.x, ratio.y, 1));
       GUI.matrix = guiMatrix;
    }
	
	public void SetupQuestWindow(int id)
	{
		for(int i=0;i<questData.questSetting.Count;i++)
		{
			if(id == questData.questSetting[i].questID)
			{
				titleQuest = questData.questSetting[i].questName;
				detailQuest = questData.questSetting[i].questDetail;
				condition.y = questData.questSetting[i].idCondition.y;
				condition.x = questData.questSetting[i].idCondition.x;
				reward.y = questData.questSetting[i].itemIDReward.y;
				reward.x = questData.questSetting[i].itemIDReward.x;
				
				
				if(questData.questSetting[i].questCondition == Quest_Data.QuestCondition.Collect)
					ConvertItemIDToName((int)condition.x,"Condition");
				else ConvertEnemyIDToName((int)condition.x);
				
				ConvertItemIDToName((int)reward.x,"Reward");
				
				questID = id;
				
			}
		}
	}
	
	void ConvertEnemyIDToName(int enemyID)
	{
		//Check Monster Id
		for(int i=0;i < monsterData.monsterList.Count;i++)
		{
			if(enemyID == monsterData.monsterList[i].enemyID)
			{
				conditionName = monsterData.monsterList[i].enemyStatus.enemyName;
				
				break;
			}
		}
	}
	
	void ConvertItemIDToName(int itemID,string type)
	{
		//Check Usable Item
		for(int i=0;i < itemData.item_usable_set.Count;i++)
		{
			if(itemID == itemData.item_usable_set[i].item_ID)
			{
				if(type == "Condition")
				{
					conditionName = itemData.item_usable_set[i].item_Name;
				}	
				else if(type == "Reward")
				{
					itemRewardName = itemData.item_usable_set[i].item_Name;
				}
				
				break;
			}
		}
		
		//Check Weapon
		for(int i=0;i < itemData.item_equipment_set.Count;i++)
		{
			if(itemID == itemData.item_equipment_set[i].item_ID)
			{
				if(type == "Condition")
				{
					conditionName = itemData.item_equipment_set[i].item_Name;
				}	
				else if(type == "Reward")
				{
					itemRewardName = itemData.item_equipment_set[i].item_Name;
				}
				
				break;
			}
		}
		
		//Check Etc Item
		
		for(int i=0;i < itemData.item_etc_set.Count;i++)
		{
			if(itemID == itemData.item_etc_set[i].item_ID)
			{
				if(type == "Condition")
				{
					conditionName = itemData.item_etc_set[i].item_Name;
				}	
				else if(type == "Reward")
				{
					itemRewardName = itemData.item_etc_set[i].item_Name;
				}
				
				break;
			}
		}
		
		//Check Gold
		
		for(int i=0;i < itemData.item_gold.Length;i++)
		{
			if(itemID == itemData.item_gold[i].item_ID)
			{
				if(type == "Condition")
				{
					conditionName = itemData.item_gold[i].item_Name;
				}	
				else if(type == "Reward")
				{
					itemRewardName = itemData.item_gold[i].item_Name;
				}
				
				break;
			}
		}
	}
	
}

背包部分我们后面再说,



上面的enemyId在在这里进行设置,不过我们的游戏使用的是回合制,所以enemy死亡掉落方式我们在战斗之后再加,我们只要知道,调用了这些就行了,

当目标npc死亡,dropitem就会触发,他根据

using UnityEngine;
using System.Collections;
using System.Collections.Generic;


public class DropItem : MonoBehaviour {
	[System.Serializable]
	public class Drop{
		public int item_id;
		public float percentDrop;
	}
	public GameObject item_Obj_Pref;
	public int gold_min, gold_max;
	public List<Drop> item_Drop_List = new List<Drop>();
	
	public float powerImpulse = 1;


	
	public void UseDropItem(){
		
		
		for(int i = 0; i < item_Drop_List.Count; i++){
			float percentResult = Random.Range(0,100);
			if(percentResult < item_Drop_List[i].percentDrop){
				GameObject go = (GameObject)Instantiate(item_Obj_Pref,transform.position+(Vector3.up),Quaternion.identity);
				go.rigidbody.AddForce(new Vector3(Random.Range(-1,1)*1.5f*powerImpulse,1*3*powerImpulse,Random.Range(-1,1)*1.5f*powerImpulse),ForceMode.Impulse);
				Item_Obj item_obj = go.GetComponent<Item_Obj>();
				item_obj.item_id = item_Drop_List[i].item_id;
				item_obj.SetItem();
				if(item_obj.gold){
					item_obj.gold_price = Random.Range(gold_min, gold_max);
				}	
			}
		}
	}
	
	
}
public List<Drop> item_Drop_List = new List<Drop>();这个list来随机生成掉落物,我们也可以用它来制作宝箱一类的物件,例如我们游戏中制作了这样的可采植物类宝箱

当触碰场景中的可采集宝箱时(宝箱类,如果想直接采集挖矿,需要另外修改),原植物(宝箱)状态改变,变为可拾取,我们可以通过这个来收集装备,制作材料,收集任务物品,,看地面上我们刚刚的可采集宝箱不见了,看包裹第一个格子里面我们出现了我们捡取的东西,因为直接用的item_id3001,所以是个牙齿,这个按需要自己来修改,修改的地方,这里,img就是在背包里面我们看到的图标,为什么我们的任务没有完成呢?我们刚刚在游戏里面接取的是个杀怪任务,我们捡去物品的是收集任务,我们只要接取1002这样的任务,然后把amount改成1,就可以完成刚刚的任务了。好了我们看看item是怎么做的,

/// <summary>
/// Item_ object.
/// This script is use for display item when drop in to scene
/// </summary>


using UnityEngine;
using System.Collections;

public class Item_Obj : MonoBehaviour {
	
	public int item_id;
	public int item_amount;
	public Item_Data.Equipment_Type euipmentType;
	public string item_name;
	public GameObject item_img_obj;
	
	[HideInInspector]
	public bool gold;
	[HideInInspector]
	public int gold_price;
	
	void OnEnable(){
		SetItem();	
	}
	
	void OnCollisionEnter(Collision c)
	{
		this.rigidbody.isKinematic = true;
	}
	
	public void SetItem(){
		
		Item_Data.Item item = Item_Data.instance.Get_Item(item_id);
		if(item != null){
			gold = item.gold;
			euipmentType = item.equipment_Type;
			item_img_obj.renderer.material.mainTexture = item.item_Img;
			item_name = item.item_Name;
			
		}
	}
	
}
这样我们任务系统需要的代码就完成80%了,之后的背包和序列化存储的时候我们还会提到任务系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值