【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秒后:

        本章完。感谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三维引擎实践 - OSG渲染线程创建过程(未完待续)

一&#xff1a;概述 一个3D应用程序&#xff0c;在创建好图形窗口之后&#xff0c;就要使用该窗口的OpenGL上下文进行渲染相关工作了&#xff0c;本节分析下OSG源码中渲染线程的建立过程。 二&#xff1a;OSG渲染线程用到了哪些类&#xff1f; 1. GraphicsThread 类&#xff0c…

政安晨:【Keras机器学习示例演绎】(五十二)—— 使用门控残差和变量选择网络进行分类

目录 简介 数据集 安装准备 数据准备 定义数据集元数据 创建用于训练和评估的 tf.data.Dataset 创建模型输入 对输入特征进行编码 实施门控线性单元 实施门控余留网络 实施变量选择网络 创建门控残差和变量选择网络模型 编译、训练和评估模型 政安晨的个人主页&am…

怎么判断自己是否适合学习PMP?

判断自己是否适合学习PMP项目管理专业人士认证&#xff0c;可以从以下几个方面进行考量&#xff1a; 1、职业发展需求&#xff1a; 如果您在项目管理领域工作&#xff0c;或计划未来从事相关工作&#xff0c;PMP认证能显著提升您的竞争力。 对于项目经理、产品经理、技术领导…

什么是边缘计算?创造一个更快、更智慧、更互联的世界

前言 如今&#xff0c;数十亿物联网传感器广泛部署在零售商店、城市街道、仓库和医院等各种场所&#xff0c;正在生成大量数据。从这些数据中更快地获得洞察&#xff0c;意味着可以改善服务、简化运营&#xff0c;甚至挽救生命。但要做到这一点&#xff0c;企业需要实时做出决策…

【ESP32】打造全网最强esp-idf基础教程——16.SmartConfig一键配网

SmartConfig一键配网 一、SmartConfig知识扫盲 在讲STA课程的时候&#xff0c;我们用的是代码里面固定的SSID和密码去连接热点&#xff0c;但实际应用中不可能这么弄&#xff0c;我们得有办法把家里的WiFi SSID和密码输入到设备里面去&#xff0c;对于带屏带输入设备还…

15.x86游戏实战-汇编指令jmp call ret

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【服务器】在Linux查看运行的Python程序,并找到特定的Python程序

在Linux查看运行的Python程序并找到特定的Python程序 写在最前面1. 使用ps命令查看所有Python进程查看详细信息 2. 使用pgrep命令查找Python进程ID 3. 使用top或htop命令使用top命令使用htop命令 4. 使用lsof命令查找Python进程打开的文件 5. 使用nvidia-smi命令查看GPU使用情况…

Cancer Cell | 卞修武院士/时雨/平轶芳团队揭示胶质瘤巨噬细胞研究全新视角

胶质母细胞瘤&#xff08;glioblastoma&#xff0c;GBM&#xff09;作为最常见的恶性脑肿瘤之一&#xff0c;其肿瘤微环境高度复杂且侵袭性极强。肿瘤相关巨噬细胞&#xff08;TAMs&#xff09;在胶质瘤发展和免疫抑制中扮演着关键角色&#xff0c;尽管靶向TAMs的治疗策略已经取…

68.SAP FICO - 记账码学习

目录 定义 用途 配置步骤 定义记账码 - OB41 配置会计科目类型 在会计中&#xff0c;“借”和“贷”是记账符号&#xff0c;代表了记账的方向。而在SAP中却没有大家熟知的记账符号“借”和“贷”&#xff0c;那SAP中如何录入凭证呢&#xff1f;其实&#xff0c;SA…

MT3054 搭积木

1.思路&#xff1a; 把二维矩阵转化成一维编号&#xff0c;之后将编号使用并查集&#xff0c;看最后是否在同一个集合中即可。 2.代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e3 10; int n, m, cnt, root; int fa[N * N]; int dx[…

09.C2W4.Word Embeddings with Neural Networks

往期文章请点这里 目录 OverviewBasic Word RepresentationsIntegersOne-hot vectors Word EmbeddingsMeaning as vectorsWord embedding vectors Word embedding processWord Embedding MethodsBasic word embedding methodsAdvanced word embedding methods Continuous Bag-…

网络编程:各协议头(数据报格式)

一、mac头 二、ip头 protocol——tcp/udp &#xff08;7&#xff09;TTL——生存时间 三、tcp头 四、udp头

昇思大模型——MindFormers的使用----从零开始安装配置环境

MindSpore Transformers套件的目标是构建一个大模型训练、微调、评估、推理、部署的全流程开发套件&#xff0c;提供业内主流的Transformer类预训练模型和SOTA下游任务应用&#xff0c;涵盖丰富的并行特性。期望帮助用户轻松的实现大模型训练和创新研发。 MindSpore Transform…

centos更换yum源、安装Docker和换源

所有操作都是在root权限下做的&#xff0c;切换root用户 命令&#xff1a;su root 使用ls /etc/yum*查看所有的关于yum的文件的路径 先安装wget 命令&#xff1a;yum install wget -y 命令&#xff1a;cd /etc/yum.repos.d进去&#xff0c;以便于操作 我们需要配置的是Cen…

DNS 杂谈

一、定义 DNS&#xff08;Domain Name System&#xff09;&#xff0c;域名系统&#xff0c;该系统记录域名和Ip地址的相互映射关系。用户访问互联网时&#xff0c;通过域名地址得到对应的IP地址&#xff0c;这个过程称为域名解析。DNS运行于UDP协议之上&#xff0c;使用的端口…

react-类组件1

类组件&#xff1a; import { Component } from "react";class App extends Component {constructor() {super();this.state {message: "xxxxx",};}render() {return (<div><div>{this.state.message}</div></div>);} }export d…

Animate软件基础:重命名图层或文件夹

默认情况下&#xff0c;Animate 会按照创建顺序向新图层分配名称&#xff1a;图层 1、图层 2&#xff0c;依此类推。为了更好地反映图层的内容&#xff0c;可以对图层进行重命名。 如果需要对图层或图层文件夹进行重命名&#xff0c;请执行下列操作之一&#xff1a; 双击时间轴…

第三课网关作用

实验拓扑图&#xff1a; 基础配置&#xff1a; PC1的基础配置 PC2的基础配置&#xff1a; PC4的基础配置 AR1添加PC4网段: 并且添加pc1,pc2的网段。 并且添加pc1,pc2的网段。 原理&#xff1a;PC4先把数据交给100.100.100.1&#xff0c;交给了路由器&#xff0c;路由器再把数…

图文讲解IDEA如何导入JDBC驱动包

前言 学习JDBC编程,势必要学会如何导入驱动包,这里笔者用图文的方式来介绍 视频版本在这里 50秒教你怎么导入驱动包然后进行JDBC编程的学习_哔哩哔哩_bilibili 忘记录音频了,大伙凑合着看 下载驱动包 https://mvnrepository.com/artifact/mysql/mysql-connector-java 去中…

推荐3款电脑必备专业软件,错过拍大腿

SolveigMM Video Splitter SolveigMM Video Splitter是一款功能强大的视频编辑工具&#xff0c;主要用于视频的无损剪切和合并。该软件支持多种常见的视频格式&#xff0c;如AVI、WMV、ASF、MP3、WMA等。此外&#xff0c;它还支持AVCHD、MPEG-2、WebM、FLV等格式&#xff0c;并…