【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://xiahunao.cn/news/3226235.html

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

相关文章

JVM垃圾回收器详解

垃圾回收器 JDK 默认垃圾收集器&#xff08;使用 java -XX:PrintCommandLineFlags -version 命令查看&#xff09;&#xff1a; JDK 8&#xff1a;Parallel Scavenge&#xff08;新生代&#xff09; Parallel Old&#xff08;老年代&#xff09; JDK 9 ~ JDK20: G1 堆内存中…

如何将HEVC格式的视频转换为无损、未压缩的MP4格式视频?

在和大家分享视频格式转换之前&#xff0c;先跟大家分享一下HEVC格式的视频到底是什么文件&#xff1f;压缩原理是什么&#xff1f;了解了它的本质之后&#xff0c;我们就可以知道如何保证视频高清无损了。 如何将HEVC格式的视频转换为无损、未压缩的MP4格式视频&#xff1f; …

Sora模型:释放创意产业文本到视频AI的潜力

Sora&#xff0c;这个由OpenAI在2024年推出的文本到视频生成模型&#xff0c;不仅能够将文字描述转化为生动的视频内容&#xff0c;而且还能保持视频一分钟之久的连贯性和高质量&#xff0c;这在之前是难以想象的。 尽管AI在图像和文本理解上已取得巨大进步&#xff0c;但将这…

捷配PCB 6个PCB板材关键参数解读技巧

PCB板材是指覆铜基板&#xff0c;是制造电路板的最主要材料。 板材的一些关键性能参数对电路板的生产加工、元器件贴装焊接、电子产品的功能实现以及产品的使用环境或寿命等都将产生一定程度的影响&#xff0c;所以掌握板材的关键参数在实际应用中非常有必要。 PCB板材的关键性…

【Linux】进程7——查看进程

1.为什么进程管理这么重要呢&#xff1f; 这是因为&#xff1a; 首先&#xff0c;我们在操作系统时的各项任务其实都是经过某个PID来完成的&#xff08;包括你的bash环境&#xff09;&#xff0c;因此&#xff0c;能不能执行某项任务&#xff0c;就与该进程的权限有关了。再来…

PMON的解读和开发

提示&#xff1a;龙芯2K1000PMON相关记录 文章目录 1 PMON的发展和编译环境PMONPMON2000 2 PMON2000的目录结构3 Targets目录的组成4 PMON编译环境的建立5 PMON2000的框架6 异常向量表7 Pmon的空间分配8 PMON的汇编部分(starto.S或sbdreset.S)的解读Start.SC代码部分dbginit 9 …

20个实验数据创造AI蛋白质里程碑!上海交大联合上海AI Lab发布FSFP,有效优化蛋白质预训练模型

蛋白质&#xff0c;这些微小而强大的生物分子&#xff0c;是生命活动的基础&#xff0c;在生物体内扮演着多种角色。然而&#xff0c;要精确地调整和优化蛋白质功能&#xff0c;以适应特定的工业或医疗需求&#xff0c;却是一项极具挑战性的任务。传统上&#xff0c;科学家们依…

MSI打包后门成安装包

目录 浏览器下载地址 启动>next 选择后门所在路径&#xff0c;和生成安装包后存放路径 next>Hidden 配置变量 Look up随便找个伪装&#xff0c;然后点击一下Creat New ​注册表Registry导入 ​点击否&#xff0c;不购买专业版 ​安装包生成成功​编辑 浏览器下…

【昇思25天学习打卡营打卡指南-第二十二天】GAN图像生成

GAN图像生成 模型简介 生成式对抗网络(Generative Adversarial Networks&#xff0c;GAN)是一种生成式机器学习模型&#xff0c;是近年来复杂分布上无监督学习最具前景的方法之一。 最初&#xff0c;GAN由Ian J. Goodfellow于2014年发明&#xff0c;并在论文Generative Adve…

交叉熵损失函数的使用目的(很肤浅的理解)

第一种使用方法 import torch from torch import nn # Example of target with class indices loss nn.CrossEntropyLoss() input torch.randn(3, 5, requires_gradTrue) target torch.empty(3, dtypetorch.long).random_(5) output loss(input, target) output.backward(…

[Python自动化办公]--从网页登录网易邮箱进行邮件搜索并下载邮件附件

[Python自动化办公]–从网页登录网易邮箱进行邮件搜索并下载邮件附件 使用说明 ​ 本文使用Python的selenium库进行操作邮箱登录、固定名称搜索邮件并下载附件&#xff0c;Python版本&#xff1a;3.9.16, selenium版本&#xff1a;4.19.0&#xff0c;EdgeBrowser版本:126.0.2…

无线网的ip地址固定吗

在数字化日益普及的今天&#xff0c;无线网络已成为我们生活与工作中不可或缺的一部分。然而&#xff0c;对于许多非专业用户来说&#xff0c;无线网络背后的技术细节仍然充满了神秘感。其中&#xff0c;一个常见的问题是&#xff1a;无线网的IP地址是固定的吗&#xff1f;本文…

使用“nvm use 版本号“命令无效

使用"nvm use 版本号"命令无效 为什么无效?解决 为什么无效? 解决 将这个nodejs文件夹删除,然后在运行nvm use 版本号,则 node生效.

QT开发积累——qt中的注释和多行注释的几种方式,函数方法注释生成

目录 引出qt中的注释和多行注释方法的注释生成 总结日积月累&#xff0c;开发集锦方法参数加const和不加const的区别方法加static和不加static的区别Qt遍历list提高效率显示函数的调用使用&与不使用&qt方法的参数中使用&与不使用&除法的一个坑 项目创建相关新建…

window下载安装clang

执行clang报错&#xff1a; c:/>clang test.cclang: warning: unable to find a Visual Studio installation; try running Clang from a developer command prompt [-Wmsvc-not-found] clang: error: unable to execute command: program not executable clang: error: li…

数据隐私: 什么是数据隐私以及如何保护数据安全?

什么是数据隐私&#xff1f; 数据隐私&#xff08;或信息隐私&#xff09;是数据保护的一个领域。它指的是个人可以决定何时、如何以及在多大程度上与他人分享或交换他们的个人数据。 换句话说&#xff0c;数据隐私围绕着用户的个人数据如何被收集、存储、管理和与第三方共享…

Win-ARM联盟的端侧AI技术分析

Win-ARM联盟&#xff0c;端侧AI大幕将起 微软震撼发布全球首款AI定制Windows PC——Copilot PC&#xff0c;搭载全新NPU与重塑的Windows 11系统&#xff0c;纳德拉盛赞其为史上最快、最强、最智能的Windows PC。该设备算力需求高达40TOPS&#xff0c;支持语音翻译、实时绘画、文…

NesT : 嵌套层次Transformer

探讨了在不重叠的图像块上嵌套基本局部变换的思想,并以分层的方式对它们进行聚合。发现块聚合功能在实现跨块非局部信息通信中起着至关重要的作用。 这个观察结果引导我们设计一个简化的体系结构,它需要在原始视觉转换器上进行少量的代码更改。所提出的明智选择的设计有三个好…

【Spring Boot 教程:从入门到精通】掌握 Spring Boot 开发技巧与窍门(一)-java语法(1)

一些Java基本语法的基本介绍&#xff0c;语法更新结束会紧跟项目实战&#xff0c;后续会持续在该专栏进行更新&#xff01;&#xff01;&#xff01; 目录 前言 一、基本概念 1.JDK、JRE、JVM的关系&#xff1a; 2.JDK版本选择 3.Java代码的编译运行流程 4.JSE、JEE、J…

SolidWorks滚花螺栓制作-cnblog

目标 规划基准图形 确定尺寸&#xff0c;单位mm 我 对固定好的图形进行旋转 倒角 设置螺纹 注意改变深度为15mm 收尾位置补全 滚花 建立基准面 制作多边形 添加穿透 扫描切除 圆周阵列 成品完成