任务系统是对于仙剑游戏来说说并不陌生,从一代李逍遥婶婶的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%了,之后的背包和序列化存储的时候我们还会提到任务系统。