【Unity2D 2022:NPC】制作NPC

news2024/9/27 9:25:38

一、创建NPC角色

1. 创建JambiNPC并同时创建Jambi站立动画

        (1)点击第一张图片,按住shift不松,再选中后两张图片,拖到层级面板中

        (2)将动画资源文件保存到Animation Clips文件夹中

        (3)将动画控制器文件保存到Animators文件夹中

2. 将Jambi添加为预制体

二、编辑NPC属性

1. 修改层级为NPC

        (1)添加NPC层级

        (2)将Jambi的层级设置为NPC层级

2. 精灵渲染器(Sprite Renderer)

        (1)修改锚点为底部

        (2)修改渲染层级为1

3. 2D碰撞箱(Box Collider 2D)

        (1)添加 Box Collider 2D 组件(避免角色覆盖NPC)

        (2)调整碰撞体积大小

三、创建对话框

1. 创建对话框画布

2. 修改对话框画布属性

        (1)修改UI缩放模式为World(红色)

        (2)修改渲染层级为10(对话框要显示在其他游戏物体上方,因此要大于其他层级)(蓝色) 

        (3)修改缩放为0.01(绿色)

        (4)修改长度宽度,调整到合适的位置(黄色)

3. 添加图像子物体到对话框

4. 编辑图像子物体属性

        (1)使图像填充对话框画布

        (2)将对话框图片赋值给图像

5. 添加文本子物体到对话框

6. 编辑文本子物体属性

        (1)使文本填充对话框画布内边缘,锚点在文本框的四个角

        (2)调整字体大小(红色)

        (3)使文本左右居中,上下居中(蓝色)

        (4)更改文本内容(绿色)

        (5)调整字体颜色(黄色)

        (6)更改字体样式(粉色)

        (7)添加OutLine组件,为字体增加边框

        (8)改变字体边框的颜色

        (9)最终效果如下图所示

 四、添加NPC对话功能(射线检测)

1. 编辑Ruby脚本

        (1)判断E键是否按下

public class Ruby : MonoBehaviour 
{
    void Update() 
    {
        // 对话功能
        if(Input.GetKeyDown(KeyCode.E)) { // 当按下E键时

        }
    }
}

        (2)创建一条射线

public class Ruby : MonoBehaviour 
{
    void Update() 
    {
        // 对话功能
        if(Input.GetKeyDown(KeyCode.E)) { // 当按下E键时
            // 创建一条射线:起点为角色的位置偏上(Vector2.up为向上的单位向量),方向为角色的朝向, 射线长度为1.5, 发生碰撞的游戏物体层级为NPC层
            RaycastHit2D ray = Physics2D.Raycast(rb2d.position+0.2f*Vector2.up, lookDirection, 1.5f, LayerMask.GetMask("NPC"));
            // ray碰撞到的物体会存储到ray自身当中
        }
    }
}

        (3)判断射线是否碰撞到物体

public class Ruby : MonoBehaviour 
{
    void Update() 
    {
        // 对话功能
        if(Input.GetKeyDown(KeyCode.E)) { // 当按下E键时
            // 创建一条射线:起点为角色的位置偏上(Vector2.up为向上的单位向量),方向为角色的朝向, 射线长度为1.5, 发生碰撞的游戏物体层级为NPC层
            RaycastHit2D ray = Physics2D.Raycast(rb2d.position+0.2f*Vector2.up, lookDirection, 1.5f, LayerMask.GetMask("NPC"));
            // ray碰撞到的物体会存储到ray自身当中
            if(ray.collider != null) { // 若射线碰撞到的物体不为空
                
            }
        }
    }
}

        (4)使用Debug语句测试

public class Ruby : MonoBehaviour 
{
    void Update() 
    {
        // 对话功能
        if(Input.GetKeyDown(KeyCode.E)) { // 当按下E键时
            // 创建一条射线:起点为角色的位置偏上(Vector2.up为向上的单位向量),方向为角色的朝向, 射线长度为1.5, 发生碰撞的游戏物体层级为NPC层
            RaycastHit2D ray = Physics2D.Raycast(rb2d.position+0.2f*Vector2.up, lookDirection, 1.5f, LayerMask.GetMask("NPC"));
            // ray碰撞到的物体会存储到ray自身当中
            if(ray.collider != null) { // 若射线碰撞到的物体不为空
                Debug.Log("射线碰撞到的物体是:" + ray.collider.gameObject);
            }
        }
    }
}

        检测成功: 

2. 创建NPCDialog脚本

        (1)创建对话框游戏物体

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

public class NPCDialog : MonoBehaviour
{
    // 创建对话框游戏物体
    public GameObject dialogBox;

}

        (2)设置初始时对话框为隐藏状态

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

public class NPCDialog : MonoBehaviour
{
    // 创建对话框游戏物体
    public GameObject dialogBox;

    void Start()
    {
        // 设置初始时对话框为隐藏状态
        dialogBox.SetActive(false);
    }

}

         (3)编写displayDialogBox方法,用来显示对话框

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

public class NPCDialog : MonoBehaviour
{
    // 创建对话框游戏物体
    public GameObject dialogBox;

    void Start()
    {
        // 设置初始时对话框为隐藏状态
        dialogBox.SetActive(false);
    }

    public void displayDialogBox()
    {
        // 设置对话框为显示状态
        dialogBox.SetActive(true);
    }
}

        (4)创建浮点型变量DisplayTime为对话框显示时间,DisplayTimer为对话框显示计时器

public class NPCDialog : MonoBehaviour
{
    // 创建对话框游戏物体
    public GameObject dialogBox;
    // 对话框展示时间
    public float displayTime = 4;
    public float displayTimer;

    void Start()
    {
        // 设置初始时对话框为隐藏状态
        dialogBox.SetActive(false);
    }

    public void displayDialogBox()
    {
        // 设置对话框为显示状态
        dialogBox.SetActive(true);
    }
}

        (5)在DisplayDialog方法中设置计时器的值为最长显示时间

public class NPCDialog : MonoBehaviour
{
    // 创建对话框游戏物体
    public GameObject dialogBox;
    // 对话框展示时间
    public float displayTime = 4;
    public float displayTimer;

    void Start()
    {
        // 设置初始时对话框为隐藏状态
        dialogBox.SetActive(false);
    }

    public void displayDialogBox()
    {
        // 设置对话框为显示状态
        dialogBox.SetActive(true);
        // 重置计时器
        displayTimer = displayTime;
    }
}

        (6)编辑Update函数,若对话框为显示状态,则开始计时。当计时器小于0后,设置对话框为隐藏状态

public class NPCDialog : MonoBehaviour
{
    // 创建对话框游戏物体
    public GameObject dialogBox;
    // 对话框展示时间
    public float displayTime = 4;
    public float displayTimer;

    void Start()
    {
        // 设置初始时对话框为隐藏状态
        dialogBox.SetActive(false);
    }

    private void Update()
    {
        if(dialogBox.active) {
            displayTimer -= Time.deltaTime;
            if(displayTimer < 0) {
                dialogBox.SetActive(false);
            }
        }
    }

    public void displayDialogBox()
    {
        // 设置对话框为显示状态
        dialogBox.SetActive(true);
        displayTimer = displayTime;
    }
}

3. 修改Ruby脚本

        (1)删除Debug语句,创建NPC对话对象为ray碰撞到的物体对话组件

public class Ruby : MonoBehaviour 
{
        // 对话功能
        if(Input.GetKeyDown(KeyCode.E)) { // 当按下E键时
            // 创建一条射线:起点为角色的位置偏上(Vector2.up为向上的单位向量),方向为角色的朝向, 射线长度为1.5, 发生碰撞的游戏物体层级为NPC层
            RaycastHit2D ray = Physics2D.Raycast(rb2d.position+0.2f*Vector2.up, lookDirection, 1.5f, LayerMask.GetMask("NPC"));
            // ray碰撞到的物体会存储到ray自身当中
            if(ray.collider != null) { // 若射线碰撞到的物体不为空
                // 创建NPC对话对象为ray碰撞到的物体的对话组件
                NPCDialog npcDialog = ray.collider.gameObject.GetComponent<NPCDialog>();
            }
        }
    }

}

        (2)当对话组件不为空时,设置对话框为显示状态

public class Ruby : MonoBehaviour 
{
        // 对话功能
        if(Input.GetKeyDown(KeyCode.E)) { // 当按下E键时
            // 创建一条射线:起点为角色的位置偏上(Vector2.up为向上的单位向量),方向为角色的朝向, 射线长度为1.5, 发生碰撞的游戏物体层级为NPC层
            RaycastHit2D ray = Physics2D.Raycast(rb2d.position+0.2f*Vector2.up, lookDirection, 1.5f, LayerMask.GetMask("NPC"));
            // ray碰撞到的物体会存储到ray自身当中
            if(ray.collider != null) { // 若射线碰撞到的物体不为空
                // 创建NPC对话对象为ray碰撞到的物体的对话组件
                NPCDialog npcDialog = ray.collider.gameObject.GetComponent<NPCDialog>();
                if(npcDialog != null) { // 若对话组件不为空
                    // 设置对话框为显示状态
                    npcDialog.displayDialogBox();
                }
            }
        }
    }

}

4. 为Jambi添加NPCDialog脚本,并将Dialog游戏物体赋值到Dialog Box中

5. 最终效果如下图所示

        (1)初始时:

        (2)按下E键后:

        (3)经过4秒后:

        本章完。感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1914521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全栈业务开发入门——登录业务接口

业务已上传则资源 实现登录业务的前后端联调&#xff0c;前端点击登录按钮向后端发送一个请求&#xff0c;后端调用接口向前端响应结果 效果如下&#xff1a; 设计环境&#xff1a;springbootmybatisvue3axios 一.前端设计 1.基于vue3脚手架创建项目&#xff0c;搭建项目结构…

快问快答,一套源码的价格在多少钱左右?

购买一套商城源码的价格大致在几千元到几十万不等&#xff0c;具体取决于多种因素。下面将详细分析影响商城源码价格的主要因素&#xff1a; 商城类型 B2B2C商城&#xff1a;这类商城支持平台自营和多商户入驻&#xff0c;功能相对复杂&#xff0c;价格较高。一般价格在8-15万…

移动UI:发现页面,是什么,有啥作用,该如何设计呢?

移动应用中的“发现页面”通常用于向用户展示新的内容、功能、活动或推荐信息&#xff0c;以帮助用户发现和探索应用中的新内容或功能。设计一个好的发现页面可以提升用户对应用的兴趣和粘性。 以下是设计发现页面时可以考虑的一些要点&#xff1a; 1. 推荐内容&#xff1a; …

【网络安全科普】网络安全指南请查收

随着社会信息化深入发展&#xff0c;互联网对人类文明进步奖发挥更大的促进作用。但与此同时&#xff0c;互联网领域的问题也日益凸显。网络犯罪、网络监听、网络攻击等是又发生&#xff0c;网络安全与每个人都息息相关&#xff0c;下面&#xff0c;一起来了解网络安全知识吧。…

如何保障生物制药中试验网和办公网之间的跨网安全文件交换数据?

在针对数据化大环境下&#xff0c;生物制药企业的数据安全尤为关键&#xff0c;尤其是试验网与办公网之间的数据交换。这些数据不仅包含新药品研发成果、临床试验数据&#xff0c;还有健康医疗数据等&#xff0c;都是企业的核心竞争力和商业秘密 。因此&#xff0c;安全地进行跨…

代码随想录(day3)有序数组的平方

暴力求解法&#xff1a; 注意&#xff1a;需要确定范围&#xff0c;比如nums.sort()是在for循环之外&#xff0c;根据函数的功能来确定 return返回的是nums&#xff0c;而不是nums[i]因为返回的是整个数组 class Solution(object):def sortedSquares(self, nums):for i in r…

【Linux】:程序替换

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux程序替换的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门…

AWS-WAF-Log S3存放,通过Athena查看

1.创建好waf-cdn 并且设置好规则和log存储方式为s3 2. Amazon Athena 服务 使用 &#xff08;注意s3桶位置相同得区域&#xff09; https://docs.aws.amazon.com/zh_cn/athena/latest/ug/waf-logs.html#waf-example-count-matched-ip-addresses 官方文档参考,建一个分区查询表…

批量发送定制邮件内容

需要给以下学员发送作业反馈邮件&#xff08;文件名为&#xff1a;学员作业反馈.xlsx&#xff09; 学员序号学员姓名学员邮箱作业反馈20090001海龙3177261496qq.com第1题&#xff1a;少了一个a20090002真达3177261496qq.com第2题&#xff1a;少了一个b20090003张三3177261496…

Python: 分块读取文本文件

在处理大文件时&#xff0c;逐行或分块读取文件是很常见的需求。下面是几种常见的方法&#xff0c;用于在 Python 中分块读取文本文件&#xff1a; 1、问题背景 如何分块读取一个较大的文本文件&#xff0c;并提取出特定的信息&#xff1f; 问题描述: fopen(blank.txt,r) quot…

昇思25天学习打卡营第17天|应用实践之SSD目标检测

基本介绍 今天要学习的内容是计算机视觉领域中的目标检测任务。与图像分类相比&#xff0c;目标检测更难&#xff0c;因为目标检测不仅要检测出图片中的物体的类别&#xff0c;还要检测出该物体的位置。现主流的目标检测算法大致可分为两种&#xff0c;一种是基于CNN的&#xf…

Type-C/DP1.4到HDMI2.0替代龙讯LT8711HE,集睿智远CS5262

NCS8622是一款高性能低功耗的Type-C/DP1.4到HDMI2.0转换器&#xff0c;设计为连接USB Type-C源或DP1.4源到HDMI2.0。 NCS8622集成了符合DP1.4标准的接收器&#xff0c;以及符合HDMI2.0标准的发射器。此外&#xff0c;CC控制器用于将CC通信到实现DP Alt模式。DP接收器集成了HDCP…

软考五个高级科目怎么选?如何一口气拿下证书!

软考高级包括&#xff1a; 信息系统项目管理师、系统分析师、系统架构设计师、网络规划设计师、系统规划与管理师等五个考试。 一、各科特点&#xff1a; 信息系统项目管理师 特点&#xff1a;主要从事信息系统项目管理方面的工作&#xff0c;要求掌握项目管理的知识体系和实…

类与对象-继承-构造和析构顺序

构造和析构顺序 #include<iostream> using namespace std;class Base { public:Base(){cout << "Base构造函数" << endl;}~Base(){cout << "Base析构函数" << endl;} };class Son :public Base { public:Son(){cout <&l…

C#开发:下载node.js指定版本

一、打开官网 二、找到指定版本 三、选择程序包msi下载 四、验证下载是否成功 cmd输入&#xff1a; node -v npm -v

从零开始学量化~Ptrade使用教程(四)——股票普通买卖与回购业务

股票普通买卖 股票买入 通过选择委托方向实现股票的买入与卖出&#xff0c;可根据输入的价格自动查询可买数量。 用鼠标点击【买入】&#xff0c;如图所示&#xff1a; 输入股票代码并选中后&#xff0c;选择委托类型&#xff0c;若为限价类型&#xff0c;输入委托价格&#xf…

如何用Vue3和Plotly.js绘制交互式瀑布图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 使用 Plotly.js 在 Vue 中创建瀑布图 应用场景 瀑布图广泛用于可视化财务报表和展示增量变化&#xff0c;例如利润表、现金流量表和收入分析。它们通过将正值和负值堆叠在垂直轴上&#xff0c;清晰地展示每个…

宿州降本 提质 增效 数据采集监控平台提高生产自动化水平

在当今竞争激烈的市场环境中&#xff0c;企业追求降本、提质、增效已成为发展的关键。而我们的[数据采集监控平台名称]数据采集监控平台&#xff0c;正是助力企业实现这一目标的强大工具。 LP-SCADA数据采集监控平台是工业4.0中主要的数据采集系统之一&#xff0c;主要针对产线…

告别堆积,迎接清新:回收小程序,打造无废生活新选择

在快节奏的现代生活中&#xff0c;物质的丰富与便利似乎成为了我们日常的一部分&#xff0c;但随之而来的&#xff0c;是日益增长的废弃物堆积问题。街道边、社区里&#xff0c;甚至是我们的家中&#xff0c;废弃物品仿佛无孔不入&#xff0c;逐渐侵蚀着我们的生活空间与环境质…

漏洞挖掘思路分享 | 首次尝试cnvd捡洞

因为那天项目刚忙完闲来无事&#xff0c;尝试捡个cnvd洞&#xff0c;cnvd录取要五千万资产&#xff0c;自己又懒得找毕竟捡洞嘛&#xff0c;索性去cnvd上进行搜集 直接开搜弱口令&#xff0c;因为我比较喜欢有登录框的站&#xff0c;这样搜索出来的资产可能就更容易进行挖掘 随…