游戏开发常见操作梳理之NPC任务系统

2024-01-21

多数游戏存在任务系统,接下来介绍通过NPC触发任务的游戏制作代码。

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

/// <summary>
/// 一个用于控制任务管理者NPC的脚本
/// </summary>
public class BarNPC : NPC
{
    public static BarNPC _instance;
    //对于动画的控制
    public TweenPosition questTween;

    //表示是否在任务之中
    public bool isInTask=false;
    //表示任务进度
    public int killCount = 0;

    //对于接受按钮的点击
    public UIButton btnAccept;
    //对于取消按钮的点击
    public UIButton btnCancel;
    //对于确定按钮的点击
    public UIButton btnOk;
    //对于关闭按钮的点击
    public UIButton btnClose;

    //关联面板上面的文字
    public UILabel desLabel;

    //关联外来脚本
    private PlayerStatus status;

    //关联任务面板
    public GameObject TaskPanel;
    public UILabel taskProgress;
    public UILabel taskNotFinished;
    public UILabel taskFinished;
    //private TweenAlpha tween;
    //public UISprite task1;


    private void Awake()
    {
        _instance= this;
       // tween = task1.GetComponent<TweenAlpha>();
    }
    //初始化这些按钮的点击
    void Start()
    {
        //关联脚本
        status=GameObject.FindGameObjectWithTag(Tags.player).GetComponent<PlayerStatus>();

        //对于接受按钮的点击
        btnAccept.onClick.Add(new EventDelegate(() =>
        {
            ShowTaskProgress();
            //表示在任务中
            isInTask= true;
            TaskPanel.SetActive(true);
            taskProgress.text = "任务进度(" + killCount + "//10)";
            taskNotFinished.gameObject.SetActive(true);
            taskFinished.gameObject.SetActive(false);

        }));
        //对于取消按钮的点击
        btnCancel.onClick.Add(new EventDelegate(() =>
        {
            //取消后隐藏
            HideQuest();
        }));
        //对于确定按钮的点击
        btnOk.onClick.Add(new EventDelegate(() =>
        {
            //完成任务
            if(killCount>=10)
            {
                //获取金币,清空任务量计算
                Inventory._instance.AddCoin(1000);
                killCount = 0;
                ShowTaskDes();
               // TaskPanel.SetActive(false);
            }
            //没有完成任务
            else
            {
                HideQuest();
            }
        }));
        //对于关闭按钮的点击
        btnClose.onClick.Add(new EventDelegate(() =>
        {
            //隐藏面板
            HideQuest();
        }));
    }
    private void Update()
    {
        taskProgress.text = "任务进度(" + killCount + "//10)";
        if (killCount >= 10)
        {
            taskNotFinished.gameObject.SetActive(false);
            taskFinished.gameObject.SetActive(true);
        }


    }
    void ShowTaskDes()
    {
        //更新任务
        desLabel.text = "任务:\n杀死10只小野狼\n\n奖励:\n1000金币";
        //隐藏OK按钮
        btnOk.gameObject.SetActive(false);
        //显示自己和取消按钮
        btnAccept.gameObject.SetActive(true);
        btnCancel.gameObject.SetActive(true);
       
    }
    void ShowTaskProgress()
    {
        //更新任务
        desLabel.text = "任务:\n你已经杀死了" + killCount + "\\10只小野狼\n\n奖励:\n1000金币";
        //显示OK按钮
        btnOk.gameObject.SetActive(true);
        //隐藏自己和取消按钮
        btnAccept.gameObject.SetActive(false);
        btnCancel.gameObject.SetActive(false);
    }
    private void OnMouseOver()
    {
        //当鼠标位于这个collider之上的时候
        //点击NPC的时候
        if(Input.GetMouseButtonDown(0)&&UICamera.isOverUI == false)
        {
            GetComponent<AudioSource>().Play();
            if(isInTask)
            {
                ShowTaskProgress();
            }
            else
            {
                ShowTaskDes();
            }
            ShowQuest();
        }
    }

    void ShowQuest()
    {
        questTween.gameObject.SetActive(true);
        //正向播放
        questTween.PlayForward();
    }
    void HideQuest()
    {
        //倒向播放
        questTween.PlayReverse();
    }
    //任务系统 点击对话框上面的按钮 进行的一些处理

    public void OnKillWolf()
    {
        if(isInTask)
        {
            killCount++;
        }
    }
}

为了暗示玩家点击NPC对话,我们通常还会制作不同的鼠标指针提示玩家。鼠标指针的提示管理逻辑:

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

public class CursorManager : MonoBehaviour
{
    public static CursorManager _instance;
    public Texture2D cursor_normal;
    public Texture2D cursor_npc_talk;
    public Texture2D cursor_attack;
    public Texture2D cursor_lockTarget;
    public Texture2D cursor_pick;

    private Vector2 hotspot=Vector2.zero;
    private CursorMode mode = CursorMode.Auto;
    // Start is called before the first frame update
    void Start()
    {
        _instance= this;
    }
    public void SetNormal()
    {
        Cursor.SetCursor(cursor_normal,hotspot,mode);
    }
    public void SetNpcTalk()
    {
        Cursor.SetCursor(cursor_npc_talk,hotspot,mode);
    }
    public void SetAttack()
    {
        Cursor.SetCursor(cursor_attack,hotspot,mode);
    }
    public void SetLockTarget()
    {
        Cursor.SetCursor(cursor_lockTarget,hotspot,mode);
    }

}

由于一个游戏中不止一个NPC,所以我们通常还要制作一个NPC 的管理类:

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

public class NPC : MonoBehaviour
{
    //进入
    private void OnMouseEnter()
    {
        if(UICamera.isOverUI == false)
           CursorManager._instance.SetNpcTalk();
    }
    //移出
    private void OnMouseExit()
    {
        if (UICamera.isOverUI == false)
            CursorManager._instance.SetNormal();
    }
}

将任务面板显示在玩家左边,使其更加清晰地提醒玩家,相关逻辑:

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

public class TaskPanel : MonoBehaviour
{
    //关联隐藏按钮
    public UIButton btnHide;
    //关联呼出按钮
    public UIButton btnShow;
    //关联动画
    private TweenAlpha tweentitle;
    private TweenAlpha tweentask;
    public UISprite Title;
    public UISprite task;
    private void Awake()
    {
        tweentitle = Title.GetComponent<TweenAlpha>();
        tweentask = task.GetComponent<TweenAlpha>();
    }

    private void Start()
    {
        btnHide.onClick.Add(new EventDelegate(() =>
        {
            tweentask.PlayReverse();
            tweentitle.PlayReverse();
            btnShow.gameObject.SetActive(true);
            btnHide.gameObject.SetActive(false);
        }));
        btnShow.onClick.Add(new EventDelegate(() =>
        {
            tweentask.PlayForward();
            tweentitle.PlayForward();
            btnHide.gameObject.SetActive(true);
            btnShow.gameObject.SetActive(false);
        }));
    }
}

以上就是任务系统的完整逻辑了,适合于有一定基础的小伙伴,没有基础的小伙伴只需要正确拼接应该有的UI以及NPC即可,有一些逻辑可能关联了其它的系统,你可以自行选择删除,如果有疑问的点欢迎大家来向我提问,我很高兴为大家解答。以上代码还有优化空间,但是简单的核心逻辑已经全部写出了,希望对你有一定的帮助,喜欢就点个赞支持一下吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

游戏开发常见操作梳理之NPC任务系统 的相关文章

  • 使用 ## 和 __LINE__ 创建 C 宏(与定位宏的标记串联)

    我想创建一个 C 宏来创建一个基于名称的函数 在行号上 我想我可以做类似的事情 真正的函数在大括号内有语句 define UNIQUE static void Unique LINE void 我希望能扩展到类似的内容 static voi
  • 如何在 Asp.Net Core 6 中向类型化 HttpClient 添加承载令牌身份验证

    我正在尝试使用 ASP Net Core 6 设置一个 Web api 以便用户可以到达我的端点 然后我使用特权帐户在幕后的 D365 中执行一些工作 我正在使用类型化的 HTTP 客户端 但我不确定如何插入承载身份验证 以便来自该客户端的
  • 如何准备sql语句并绑定参数?

    不幸的是 文档 http www sqlite org完全缺乏示例 这真的很奇怪 就好像它假设所有读者都是优秀的程序员一样 然而 我对C 并且无法真正从文档中弄清楚如何真正准备和执行语句 我喜欢它的实施方式PDO for PHP 通常 我只
  • C# 中输入按键

    我尝试了这段代码 private void textBox1 KeyPress object sender KeyPressEventArgs e if Convert ToInt32 e KeyChar 13 MessageBox Sho
  • C++ 中可以使用匿名类作为返回类型吗?

    有没有办法在 C 中使用匿名类作为返回类型 我用谷歌搜索这可能有效 struct Test fun 但是这段代码无法编译 错误信息是 新类型不能在返回类型中定义 其实代码没有任何意义 我只是想弄清楚匿名类是否可以用作C 中的返回类型 这是我
  • 在关键服务器上对字符串进行内存受限的外部排序,并合并和计算重复项(数十亿个文件名)

    我们的服务器生成如下文件 c521c143 2a23 42ef 89d1 557915e2323a sign xml在其日志文件夹中 第一部分是GUID 第二部分是名称模板 我想计算具有同名模板的文件的数量 例如 我们有 c521c143
  • 公共基类打破了元组的空基类优化

    gcc 4 7 1 对元组进行空基类优化 我认为这是一个非常有用的功能 然而 这似乎有一个意想不到的限制 include
  • 如何在 C# 中创建 PKCS12 .p12 文件?

    这可能是一个n00b问题 但我在这方面确实没有任何经验 我需要创建一个包含 X509 证书和私钥的 p12 捆绑包 我当前有两个对象 X509Certificate2 和包含关键信息的 RSAParameters 对象 如何将它们合并到 p
  • 使用 ClosedXML 附加到 excel 文件

    我需要将新数据附加到使用 ClosedXML 创建的现有 Excel 文件中 如何使用 ClosedXML 附加到 Excel 文件 如何获取最后一条记录的行号并将其附加到该行号上 或者还有其他内容 Thanks 打开现有工作簿 然后使用L
  • 哪个更快?按引用传递与按值传递 C++

    我认为按引用传递应该比按值传递更快 因为计算机不复制数据 它只是指向数据的地址 但是 请考虑以下 C 代码 include
  • Bazel:将编译标志添加到默认 C++ 工具链

    我想向默认的 C 工具链添加一些编译器和链接器标志 以便我构建的所有目标 本地或导入 共享它们 我知道可以定义我自己的工具链 但我不想这样做 因为它非常复杂且容易出错 理想情况下我想要这样的东西 cc toolchain cc defaul
  • 为什么 std::atomic 比 volatile bool 慢很多?

    多年来我一直使用 volatile bool 来控制线程执行 并且效果很好 in my class declaration volatile bool stop In the thread function while stop do th
  • 我应该使用 Helgrind 还是 DRD 进行线程错误检测?

    好像Valgrind http valgrind org docs manual manual html有两个工具都可以进行线程错误检测 Helgrind http valgrind org docs manual hg manual ht
  • C# 中的类和模块有什么用

    有人可以解释一下类和模块之间的区别吗 你什么时候使用其中一种而不是另一种 我正在使用 C 更新 我的意思是相当于 VB 模块的 C 版本 这在很大程度上取决于您所指的 模块 Visual Basic 的模块 C 中没有真正等效的 VB Ne
  • 在 boost 元组、zip_iterator 等上使用 std::get 和 std::tie

    我有哪些使用选择std get lt gt and std tie lt gt 与增强结构一起 例子 我想使用基于范围的 for 循环在多个容器上进行迭代 我可以实施zip函数 它使用boost zip iterator include
  • 如何在RcppParallel中调用用户定义的函数?

    受到文章的启发http gallery rcpp org articles parallel distance matrix http gallery rcpp org articles parallel distance matrix 我
  • 没有 FPU 的处理器中的浮点计算

    是否可以在没有浮点单元的嵌入式处理器中执行浮点运算 是的 您只需要在软件中完成即可 你的编译器可能会提供支持 http gcc gnu org onlinedocs gccint Soft float library routines ht
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • 如何在c#中获取斐波那契数

    伙计们 我有一个关于斐波那契的问题 如何获得斐波那契数列 该数字也将以用户输入结束 例如 如果我输入 21 则输出必须为 0 1 1 2 3 5 8 13 21 这是我的代码 static void Main string args int
  • 从 git 签出后 nuget dll 丢失

    I have a C solution containing different projects On those projects I have some normal nuget packages like Newtonsoft Js

随机推荐

  • 【计算机毕业设计】电商个性化推荐系统

    伴随着我国社会的发展 人民生活质量日益提高 于是对电商个性化推荐进行规范而严格是十分有必要的 所以许许多多的信息管理系统应运而生 此时单靠人力应对这些事务就显得有些力不从心了 所以本论文将设计一套电商个性化推荐系统 帮助商家进行商品信息 在
  • 【计算机毕业设计】电影播放平台

    电影播放平台采用B S架构 数据库是MySQL 网站的搭建与开发采用了先进的java进行编写 使用了springboot框架 该系统从两个对象 由管理员和用户来对系统进行设计构建 主要功能包括 个人信息修改 对用户 电影分类 电影信息等功能
  • 【计算机毕业设计】电影院订票信息管理系统

    当今社会已经步入了科学技术进步和经济社会快速发展的新时期 国际信息和学术交流也不断加强 计算机技术对经济社会发展和人民生活改善的影响也日益突出 人类的生存和思考方式也产生了变化 传统电影院订票采取了人工的管理方法 但这种管理方法存在着许多弊
  • 【计算机毕业设计】北工国际健身俱乐部

    本系统为会员而设计制作北工国际健身俱乐部 旨在实现北工国际健身俱乐部智能化 现代化管理 本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理 从而为现代管理人员的使用提
  • 【计算机毕业设计】二手图书交易系统

    随着世界经济信息化 全球化的到来和互联网的飞速发展 推动了各行业的改革 若想达到安全 快捷的目的 就需要拥有信息化的组织和管理模式 建立一套合理 动态的 交互友好的 高效的二手图书交易系统 当前的信息管理存在工作效率低 工作繁杂等问题 基于
  • 【计算机毕业设计】趵突泉景区的智慧导游小程序_5ztvv

    当今社会已经步入了科学技术进步和经济社会快速发展的新时期 国际信息和学术交流也不断加强 计算机技术对经济社会发展和人民生活改善的影响也日益突出 人类的生存和思考方式也产生了变化 传统趵突泉景区的智慧导游采取了人工的管理方法 但这种管理方法存
  • 【计算机毕业设计】二手家电管理平台

    时代在飞速进步 每个行业都在努力发展现在先进技术 通过这些先进的技术来提高自己的水平和优势 二手家电管理平台当然不能排除在外 二手家电管理平台是在实际应用和软件工程的开发原理之上 运用java语言以及前台VUE框架 后台SpringBoot
  • 【计算机毕业设计】毕业生就业管理微信小程序_lm9q0

    腾讯公司在2017年1月19日发布了一款不需要下载 不需要卸载 不需要存储的软件叫微信小程序 受到了很多人的喜欢 微信小程序自2017年发布至今 依托微信的社交属性和庞大的用户基数 已经渗透到生活的方方面面 1 微信小程序可以将基于微信平台
  • 【计算机毕业设计】微信小程序反诈科普平台

    相比于以前的传统手工管理方式 智能化的管理方式可以大幅降低反诈科普平台的运营人员成本 实现了反诈科普平台的标准化 制度化 程序化的管理 有效地防止了反诈科普平台的随意管理 提高了信息的处理速度和精确度 能够及时 准确地查询和修正反诈科普 一
  • 【计算机毕业设计】SpringBoot+Vue.js协同过滤算法美食推荐小程序 _7tr93

    伴随着我国社会的发展 人民生活质量日益提高 于是对各种需求进行规范而严格是十分有必要的 所以许许多多的微信小程序应运而生 此时单靠人力应对这些事务就显得有些力不从心了 所以本论文将设计一套协同过滤算法美食推荐小程序 帮助美食推荐进行美食分类
  • 一直可以投到4月初的【央企】金融科技岗&;综合类岗位!

    题解 判断字母 include
  • 【计算机毕业设计】白优校园社团网站的设计与实现

    近些年 随着中国经济发展 人民的生活质量逐渐提高 对网络的依赖性越来越高 通过网络处理的事务越来越多 随着白优校园社团网站的常态化 如果依然采用传统的管理方式 将会为工作人员带来庞大的工作量 这将是一个巨大考验 需要投入大量人力开展对社团
  • 【计算机毕业设计】宝鸡文理学院学生成绩动态追踪系统

    研究开发宝鸡文理学院学生成绩动态追踪系统的目的是让使用者可以更方便的将人 设备和场景更立体的连接在一起 能让用户以更科幻的方式使用产品 体验高科技时代带给人们的方便 同时也能让用户体会到与以往常规产品不同的体验风格 与安卓 iOS相比较起来
  • 打造视听盛宴——Resolume Arena 7,一款强大的VJ音视频软件

    在当今数字时代 视觉艺术和音乐的融合已经成为了许多娱乐活动和演出的重要组成部分 而在这个领域中 Resolume Arena 7无疑是一款备受赞誉的VJ音视频软件 Resolume Arena 7具备强大的功能和直观的界面设计 使得用户能够
  • 打造完美人像,PixCake像素蛋糕助您一键修图

    您是否曾经为自己的人像照片需要进行繁琐的修图而感到困扰 是否曾经想要打造出完美的自拍照 却不知道该如何下手 现在 我们为您推荐一款强大的人像处理技术修图软件 PixCake像素蛋糕 PixCake像素蛋糕是一款基于AI人像处理技术的修图软件
  • 【计算机毕业设计】springbootstone音乐播放器的设计与实现

    随着我国经济的高速发展与人们生活水平的日益提高 人们对生活质量的追求也多种多样 尤其在人们生活节奏不断加快的当下 人们更趋向于足不出户解决生活上的问题 stone音乐播放器展现了其蓬勃生命力和广阔的前景 与此同时 为解决用户需求 stone
  • RubyMine for Mac/win:提升Ruby和Rails开发的强大IDE

    随着Ruby和Rails在Web开发领域的广泛应用 一款高效的开发工具对于提高生产力至关重要 JetBrains RubyMine正是这样一款值得信赖的集成开发环境 IDE 作为Mac和Windows平台上的强大工具 RubyMine为开发
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine