游戏任务系统
- 任务界面
- 任务的接受与完成
- (1)点击NPC时,出现任务描述
- (2)接受任务后,出现任务提示
- (3)完成任务后,提交获取奖励
- 其他设计
- 添加按钮音效
- 鼠标指针管理系统
参考: RPG游戏《黑暗之光》流程介绍与代码分析之(四):任务系统的实现.
任务界面
任务NPC模型的导入、任务UI界面的设计
- 导入NPC模型,为NPC模型添加box collider.
- 设计任务对话框,主要使用UGUI来设计。
将需要的图片改为图片精灵模式。添加图片,修改合适的图片大小(300*350)。
- 设计任务的内容。
添加任务内容文字,接受按钮和取消按钮。
解决点击UI是,角色模型移动的问题。(ugui 的防止射线穿透)
修改ugui 的防止射线穿透代码,下面列出主要部分:
using UnityEngine.EventSystems;if (Input.GetMouseButtonDown(0)&& !EventSystem.current.IsPointerOverGameObject())
任务的接受与完成
(1)点击NPC时,出现任务描述
主要实现点击NPC时,出现任务描述;点击“x”按钮时,关闭任务描述2个功能。“x”按钮需要在on click内,添加代码的OnCloseButtonClick()。主要代码如下:
public class BarNPC : MonoBehaviour
{public GameObject quest;// Start is called before the first frame updatevoid Start(){quest.SetActive(false);}void OnMouseOver(){if (Input.GetMouseButton(0)){ShowQuest();}}void ShowQuest(){quest.SetActive(true);}void HideQuest(){quest.SetActive(false);}//x按钮public void OnCloseButtonClick(){HideQuest();}
}
(2)接受任务后,出现任务提示
分析功能:
- 点击accept按钮时,显示任务进度,并出现OK按钮用于在完成任务时提交任务。
- 点击cancel按钮时,关闭任务描述。
实现功能:
在任务界面添加OK按钮。在相应按钮添加相应的代码方法。
using UnityEngine;
using UnityEngine.UI;
public class BarNPC : MonoBehaviour
{public GameObject quest;public GameObject button_accept;public GameObject button_ok;public GameObject button_cancel;public GameObject text_des;//public bool isOnTask = false; //是否处于任务状态的标志位public int killCount = 0; //当前杀死的狼 public int wolfKilledAcquire = 10; //需要杀死狼的个数void Start(){quest.SetActive(false);}void OnMouseOver(){if (Input.GetMouseButton(0)){if (isOnTask)//如果处在任务状态,即按下Accept,显示任务进度{ShowTaskProgress();}else{ShowTaskDes();}ShowQuest();}}void ShowQuest(){quest.SetActive(true);}void HideQuest(){quest.SetActive(false);}//任务描述void ShowTaskDes(){text_des.GetComponent<Text>().text = "任务:\n杀死" + wolfKilledAcquire + "只怪物\n\n奖励\n1000金币";button_ok.SetActive(false );button_accept.SetActive(true);button_cancel.SetActive(true);}//任务进度void ShowTaskProgress(){text_des.GetComponent<Text>().text = "任务:\n你已杀死了" + killCount + "/" + wolfKilledAcquire + "只怪物\n\n奖励\n1000金币";button_ok.SetActive(true);button_accept.SetActive(false);button_cancel.SetActive(false);} //x按钮public void OnCloseButtonClick(){HideQuest();}//accept按钮public void OnAcceptButtonClick(){ShowTaskProgress();isOnTask = true;}//cancel按钮public void OnCancelButtonClick(){HideQuest();}//ok按钮public void OnOKButtonClick(){if (killCount >= 10) {//完成任务}else//没有完成任务{}}
}
(3)完成任务后,提交获取奖励
为角色添加layerStatus脚本。
public class PlayerStatus : MonoBehaviour
{public int grade = 1;public int hp = 100;public int mp = 100;public int coin = 200;//金币public void GetCoint(int count){coin += count;}
}
在BarNPC中调用这个函数
private PlayerStatus status;void Start(){status= GameObject.FindGameObjectWithTag(Tags.player).GetComponent<PlayerStatus>();quest.SetActive(false);}
在OK的按钮功能中加入
public void OnOKButtonClick(){if (killCount >= wolfKilledAcquire) //完成任务{status.GetCoint(1000);killCount = 0;//进度归零ShowTaskDes();}else//没有完成任务{HideQuest();}}
其他设计
添加按钮音效
添加一个空物体,为空物体添加audio source。返回按钮,在on click内,添加该空物体,选择play()。
鼠标指针管理系统
创建一个空物体,添加CursorManager脚本。
public class CursorManager : MonoBehaviour
{public static CursorManager _instance; public Texture2D cursor_normal; //所有功能的鼠标指针外观public Texture2D cursor_npcTalk;public Texture2D cursor_attack;public Texture2D cursor_pick;public Texture2D cursor_lockTarget;public Vector2 hotspot = Vector2.zero;public CursorMode mode = CursorMode.Auto;void Start(){_instance = this;}public void SetNormalCursor()//正常指针{Cursor.SetCursor(cursor_normal, hotspot, mode);}public void SetNPCTalkCursor(){Cursor.SetCursor(cursor_npcTalk, hotspot, mode);}}
创建NPC脚本表示对所有NPC都适用的操作。
public class NPC : MonoBehaviour
{void OnMouseEnter() {CursorManager._instance.SetNPCTalkCursor();}void OnMouseExit(){CursorManager._instance.SetNormalCursor();}}
barnpc脚本继承npc脚本。