【Unity2D 2022:NPC】制作NPC

一、创建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.mzph.cn/diannao/46256.shtml

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

相关文章

电气工程VR虚拟仿真实训平台以趣味化方式增强吸引力

在工业4.0时代和教育信息化的双重推动下&#xff0c;我们致力于推动实训课件的跨界合作与共创。VR实训课件不仅促进了不同领域、不同行业之间的紧密合作&#xff0c;更让学习变得生动直观。我们凭借3D技术生动、直观、形象的特点&#xff0c;开发了大量配套3D教材&#xff0c;让…

TongRDS 2214 docker版指引(by lqw )

文章目录 前言准备工作中心节点服务节点哨兵节点 前言 部署docker版本&#xff0c;建议先参考TongRDS2214手动部署版指引&#xff08;by lqwsy&#xff09; 在本地手动部署了一套适合业务场景的rds 服务后&#xff0c;再通过dockerfile 打镜像。 准备工作 1.准备对应的安装包…

【亚马逊云】将Amazon EC2 日志数据传输到 CloudWatch 中

文章目录 1. 创建 CloudWatchLogs 策略2. 将 CloudWatchLogs 策略附加给IAM实体3. 将 IAM 角色附加到 EC2 实例4. 在 Amazon EC2 实例上安装和配置 CloudWatch Logs5. 在CloudWatch查看EC2日志6. 参考链接 实验目的&#xff1a;在运行的 EC2 Linux 实例上安装和配置 CloudWatch…

【Java--数据结构】栈:不仅仅是数据存储,它是编程的艺术

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 栈 栈的方法介绍 入栈push 出栈pop和 瞄一眼peek 判空isEmpty和判满isFull 模拟实现栈 push入栈 pop出栈和peek 测试 使用泛型实现栈 测试 使用链表实现栈&#xff08…

怎么减少pdf的MB,怎么减少pdf的大小

在数字化时代&#xff0c;pdf文件因其格式稳定、跨平台兼容性强等特点而广受欢迎。然而&#xff0c;随着内容的丰富&#xff0c;pdf文件的大小也日益增大&#xff0c;给文件传输和存储带来了不少困扰。本文将为你介绍多种减小pdf文件大小的方法&#xff0c;帮助你轻松应对这一问…

跳表的简单学习

跳表&#xff08;SkipList&#xff09;学习 1. 什么是跳表&#xff1f; 基于“空间换时间”思想&#xff0c;通过给链表建立索引&#xff0c;使得链表能够实现二分查找。 跳表是可以实现二分查找的有序链表。 2. 从单链表到跳表 对于一般的单链表&#xff0c;在其中进行查…

c语言指针超详解——入门篇

文章目录 前言1. 内存与地址内存编址 2. 指针变量和地址取地址操作符 &指针变量和解引用操作符 *指针变量解引用操作符指针变量的大小 3. 指针变量类型的意义指针的解引用指针-整数void* 指针 4. const 修饰指针const 修饰指针指向的变量const 修饰指针变量 5. 指针运算指针…

本地部署,AnimeGANv3: 将现实世界照片转化为动漫风格

目录 引言 技术背景 架构与原理 实验结果与分析 应用实例 本地部署 运行结果 Photo to Hayao Style Photo to Shinkai Style more suprise 支持多种风格 结论 参考文献 GitHub - TachibanaYoshino/AnimeGANv3: Use AnimeGANv3 to make your own animation works, …

智驭数据:深剖朴素贝叶斯算法及其实战疆域拓展

在浩瀚的数据海洋中&#xff0c;机器学习如同一艘智能航船&#xff0c;引领我们探索未知的知识岛屿。而在这艘船的诸多算法装备中&#xff0c;朴素贝叶斯&#xff08;Naive Bayes&#xff09;算法以其简洁高效、逻辑清晰的特点&#xff0c;成为了处理分类问题的一把利器。本文将…

软件测试——web单功能测试

工作职责&#xff1a; 1.负责产品系统测试&#xff0c;包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写&#xff0c;包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求&#xff1a; 1.熟练…

集成excel工具:自定义导入回调监听器、自定义类型转换器、web中的读

文章目录 I 封装导入导出1.1 定义工具类1.2 自定义读回调监听器: 回调业务层处理导入数据1.3 定义文件导入上下文1.4 定义回调协议II 自定义转换器2.1 自定义枚举转换器2.2 日期转换器2.3 时间、日期、月份之间的互转2.4 LongConverterIII web中的读3.1 使用默认回调监听器3.2…

JavaSE——集合框架二(4/6)-Map集合的遍历方式(键找值,键值对,Lambda)、Map集合案例(需求与分析,问题解决)

目录 Map集合的遍历方式 键找值 键值对 Lambda Map集合案例 需求与分析 问题解决 Map集合的遍历方式 键找值 先获取Map集合全部的键&#xff0c;再通过遍历键来找值。 键值对 把“键值对”看成一个整体进行遍历&#xff08;较为复杂&#xff09; Lambda JDK 1.8 开…

构建GitLab代码私有仓库

构建代码私有仓库 公司代码仓库一般都放在git上&#xff0c;但为了安全一般都不会放在开放的git上&#xff0c;都会搭建自己的仓库&#xff0c;今天就记录一下git搭建的过程。以下安装过程以centos7为例&#xff1a; 步骤一&#xff1a;安装并配置依赖项&#xff0c;同时打开ht…

iPhone 16 Pro系列将标配潜望镜头:已开始生产,支持5倍变焦

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 7月6日消息&#xff0c;据DigiTimes最新报道&#xff0c;苹果将在iPhone 16 Pro中引入iPhone 15 Pro Max同款5倍光学变焦四棱镜潜望镜头。 报道称&#xff0c;目前苹果已经将模组订单交至大立光电和玉…

带权重的随机选择算法

最终的结果是left的索引 代表大于等于target的最小索引&#xff0c; 用左边界的二分搜索原因是&#xff0c;如果没有目标值&#xff0c;left大于或者等于target class Solution {private int[] preSum;private Random randnew Random();public Solution(int[] w) {//写前缀和…

OpenGL笔记九之彩色三角形与重心插值算法

OpenGL笔记九之彩色三角形与重心插值算法 —— 2024-07-07 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记九之彩色三角形与重心插值算法1.运行3.main.cpp 1.运行 3.main.cpp 代码 #include <iostream>#define DEBUG//注意&#xff1a;glad…

推荐一款uniapp拖动验证码插件

插件地址&#xff1a;易盾验证码 - DCloud 插件市场 具体使用方式访问插件地址自行获取

2024.7.9.小组汇报postman分享会

文章目录 一、前言&#xff08;零&#xff09;安装&#xff08;一&#xff09;界面导航说明&#xff08;二&#xff09;发送第一个请求 二、基本功能&#xff08;一&#xff09;常见类型的接口请求(常见的接口有如下四种类型&#xff1a;1.查询参数的接口请求&#xff08;1&…

Java02--基础概念

一、注释 注释是在程序指定位置添加的说明性信息 简单理解&#xff0c;就是对代码的一种解释 1.单行注释 格式: //注释信息 2.多行注释 格式: /*注释信息*/ 3.文档注释 格式: /**注释信息*/ 注释使用的细节: 注释内容不会参与编译和运…

Linux 命令 —— top命令(查看进程资源占用)

文章目录 top 命令显示信息介绍top 命令使用 top 命令显示信息介绍 top 命令是 Linux/Unix 系统中常用的进程监控工具&#xff0c;可以实时动态显示系统中各个进程的资源占用情况&#xff0c;包括CPU、内存等。 进入 linux 系统&#xff0c;直接输入 top&#xff0c;回车&…