游戏开发常见操作梳理之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任务系统 的相关文章

  • C语言中的递归是如何工作的?

    我试图了解 C 中递归的工作原理 任何人都可以给我解释控制流吗 include
  • C++ 返回值、引用、const 引用

    你能向我解释一下返回值 值引用和值常量引用之间的区别吗 Value Vector2D operator const Vector2D vector this gt x vector x this gt y vector y return t
  • WP8.1 C# 绑定联系人图像

    信息很简单 我正在尝试创建一个可以显示用户联系人的应用程序 我也是一名自学成才的程序员 所以我在某些方面有编程经验 但总体来说我对数据绑定相对较新 首先 我有一个 ListView 控件 其中包含图像绑定
  • 每次调用新方法时触发事件

    我正在做一个logger for a c 应用程序需要记录每个方法被调用的时间以及每个方法执行时间 我可以通过调用自己的方法来做到这一点EventLogger LogMethodCall方法在每个方法的开头 但我想知道是否有办法使CLR每次
  • 使用预编译头减少 clang 编译时间

    我正在开发一个数据库项目 该项目将查询 以某种高级语言表示 编译为 C 代码 这段代码由数据库编译并执行 那部分工作得很好 现在 我正在尝试减少 C 查询代码的编译时间 我想知道是否可以使用预编译头来提高性能 该查询被转换为一个名为 Que
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • 使用 size_t 值反向遍历向量

    我想以相反的方向遍历向量的值 如您所知 向量的大小为 size t 当我使用以下代码时 for size t r m size 1 r gt 0 r x r f r for size t c r 1 c lt m size c x r m
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • 本地主机上的 .net HTTP_X_FORWARDED_FOR NULL

    抱歉 如果其他地方已经回答了这个问题 我找不到它 如果没有 我会尝试查找访问过该站点的机器的原始 IP 根据我的基本理解 变量HTTP X FORWARDED FOR无论代理和其他过滤器如何 都会显示用户的 IP 如果这是真的 我正在尝试对
  • 如何填充两个样条线或直线系列之间的区域

    我有这个Chart 如何填充两个之间的区域Series S0 and S1 说蓝色和黄色Series 为此 我们编写了其中之一Paint事件 这里的ValueToPixelPosition https msdn microsoft com
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • 将一个整数从 C 客户端发送到 Java 服务器

    我使用此代码将一个整数从我的 Java 客户端发送到我的 Java 服务器 int n rand nextInt 50 1 DataOutputStream dos new DataOutputStream socket getOutput
  • printf() 使用字符串表“解码器环”调试库

    我写这封信是想看看你们中是否有人见过或听说过我即将描述的想法的实现 我有兴趣为嵌入式目标开发 printf 风格的调试库 目标非常遥远 并且我和目标之间的通信带宽预算非常紧张 因此我希望能够以非常有效的格式获取调试消息 通常 调试语句如下所
  • 带有自定义鉴别器的 EntityFramework Code First 继承

    我正在尝试在 EntityFramework Code First 中映射以下继承 public class Member public string ProjectName get set public string AssemblyNa
  • char* argv[] 在 c/c++ 中如何工作? [复制]

    这个问题在这里已经有答案了 我知道它用于使用命令行中的参数 但我没有得到声明 字符 argv 它是否意味着指向 char 数组的指针 如果是的话为什么没有大小 如果不是动态数组 就不需要有大小吗 我做了一些研究 发现有人说它会衰减为 cha
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所

随机推荐

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

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

    电影播放平台采用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