《黑暗之光》RPG游戏案例学习(8)——第四章 游戏任务系统


参考: RPG游戏《黑暗之光》流程介绍与代码分析之(四):任务系统的实现.

任务界面

任务NPC模型的导入、任务UI界面的设计

  1. 导入NPC模型,为NPC模型添加box collider.
  2. 设计任务对话框,主要使用UGUI来设计。
    将需要的图片改为图片精灵模式。添加图片,修改合适的图片大小(300*350)。
    在这里插入图片描述
  3. 设计任务的内容。
    添加任务内容文字,接受按钮和取消按钮。
    在这里插入图片描述
    解决点击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 update
    void 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)接受任务后,出现任务提示

分析功能:

  1. 点击accept按钮时,显示任务进度,并出现OK按钮用于在完成任务时提交任务。
  2. 点击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脚本。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值