【Unity】RPG2D龙城纷争(六)关卡编辑器之角色编辑

更新日期:2024年6月26日。
项目源码:第五章发布(正式开始游戏逻辑的章节)

索引

  • 简介
    • 一、角色编辑模式
      • 1.将字段限制为只读
      • 2.创建角色(刷角色)
      • 3.预览所有角色
      • 4.编辑选中角色属性
      • 5.移动角色位置
      • 6.移除角色

简介

上一篇完成的关卡编辑器已支持创建关卡环境(主要由地块单元组成),本篇,在关卡环境的基础上,需要完成角色编辑、要诀编辑等功能(角色编辑模式)。

一、角色编辑模式

1.将字段限制为只读

在开始角色编辑模式之前,我们对角色(Role)地块(Block)类定义的字段进行一些改进,为一些字段添加ReadOnly特性标记:

    public class Role : HTBehaviour{/// <summary>/// 角色头像/// </summary>[Label("角色头像"), ReadOnly] public Sprite HeadImage;//其他省略......}public class Block : HTBehaviour{/// <summary>/// 类型/// </summary>[Label("类型"), ReadOnly] public BlockType Type;//其他省略......}

ReadOnly使得该字段为只读的,在检视器面板上不可编辑。

在这里插入图片描述

这样做的目的是防止这些属性被不小心篡改,因为他们都将交由关卡编辑器来权衡设置。

当然你也可以不这样做,只需去掉ReadOnly标记即可。

2.创建角色(刷角色)

试想一下角色编辑的功能该如何展现,第一步必然是能够创建角色,在这里我们想像刷地块一样,鼠标停留到一个位置,直接就能在该位置刷出一个角色。

那么,着手开干:

        /// <summary>/// 是否激活角色刷子/// </summary>private bool _isActiveRoleBrush = false;/// <summary>/// 角色刷子类型名称/// </summary>private string[] _roleBrushTypeName = new string[] { "玩家", "敌人" };/// <summary>/// 角色刷子类型(刷出来的角色属于此阵营)/// </summary>private RoleCamp _roleBrushType = RoleCamp.Player;/// <summary>/// 角色刷子数据集(刷出来的角色使用此数据集)/// </summary>private RoleDataSet _roleDataSet;/// <summary>/// 创建一个角色/// </summary>/// <param name="block">角色所在地块</param>/// <param name="dataSet">角色数据集</param>private void CreateRole(Block block, RoleDataSet dataSet){//通过角色模板 _roleTmp 创建一个新角色GameObject obj = PrefabUtility.InstantiatePrefab(_roleTmp) as GameObject;obj.name = "Role";obj.transform.SetParent(_level.RolesRoot);obj.transform.localPosition = new Vector3(block.transform.position.x, block.transform.position.y, -1);obj.transform.localRotation = Quaternion.identity;obj.transform.localScale = Vector3.one;obj.SetActive(true);//为角色生成一个随机ID,并应用刷子类型(角色阵营),这里类似刷地块的逻辑Role role = obj.GetComponent<Role>();role.ID = Guid.NewGuid().ToString();role.Name = dataSet.name;role.Camp = _roleBrushType;//设置角色数据集role.SetDataSet(dataSet);_roles.Add(role);//与地块建立关联role.StayBlock = block;block.StayRole = role;EditorUtility.SetDirty(role);EditorUtility.SetDirty(block);Selection.activeGameObject = obj;}

如上,完成了创建角色的方法,再通过刷子相关的控制变量,实现UI控件面板后:

在这里插入图片描述

要实现按1键开刷的功能,依然是在OnSceneGui方法中补充代码:

        private void OnSceneGui(SceneView sceneView){if (Event.current == null)return;if (_editMode == EditMode.Map && _isActiveMapBrush){//地块编辑模式}else if (_editMode == EditMode.Role && _isActiveRoleBrush && _roleDataSet != null){if (Event.current.isKey && Event.current.keyCode == KeyCode.Alpha1 && Event.current.type == EventType.KeyDown){//将Scene视图坐标转换为世界坐标Vector2 pos = ScreenToWorldPointInScene(sceneView.camera, Event.current.mousePosition);//获取坐标位置的地块Block block = GetBlockByPoint(pos);if (block){//必须该地块不存在角色if (block.StayRole == null){//才在该地块创建一个角色CreateRole(block, _roleDataSet);}}}EditorGUIUtility.AddCursorRect(sceneView.position, MouseCursor.SlideArrow);}}

此时,我们便可以创建一个角色数据集,然后开刷了:

在这里插入图片描述

不过,刚刷出来的角色是没有头像的,这里显示为红色是因为他所属敌方阵营

而且,角色头像前面已经被我们搞成ReadOnly了,这里也修改不了啊(检视器面板只能看),所以,迫切需要在关卡编辑器中实现对这一个个灰色属性的编辑功能。

3.预览所有角色

首先,为了能全局预览场景中的所有角色,我们先将所有角色按阵营进行分类展示:

        /// <summary>/// 玩家角色数量/// </summary>private int _playerNum;/// <summary>/// 敌人角色数量/// </summary>private int _enemyNum;/// <summary>/// 当前选中的角色物体/// </summary>private GameObject _currentSelectRoleObj;/// <summary>/// 当前选中的角色/// </summary>private Role _currentSelectRole;/// <summary>/// 是否显示所有玩家角色/// </summary>private bool _isShowPlayer = false;/// <summary>/// 是否显示所有敌人角色/// </summary>private bool _isShowEnemy = false;

通过加入上面的控制代码,然后再结合UI控件代码,实现在2个区域(玩家、敌人阵营)分别预览所有角色(UI控件代码就不贴了,看看源码就一目了然):

在这里插入图片描述

4.编辑选中角色属性

我们规定同时只能选中一个角色,进而进入编辑此角色状态。

那么,当选中角色时(Scene视图中选中角色物体),角色会被赋予到_currentSelectRoleObj_currentSelectRole

Tip:为了避免重复GetComponent<Role>(),使用_currentSelectRole来缓存当前角色物体身上的Role组件。

        private void EditRoleGUI(){//如果Scene视图中选择的目标物体改变if (_currentSelectRoleObj != Selection.activeGameObject){//则尝试获取其上的Role组件_currentSelectRoleObj = Selection.activeGameObject;_currentSelectRole = _currentSelectRoleObj != null ? _currentSelectRoleObj.GetComponent<Role>() : null;}if (_currentSelectRole != null){//此时便选中了角色,在这里展示角色的相关属性,同时支持编辑}}

通过敲完繁琐的UI控件代码后,现在的编辑器界面便是这样:

在这里插入图片描述

在这里,我们可以重新赋予角色的数据集,以更换其内核。

赋予头像灰色头像(仅当角色禁用时展示),头像改变后,会立即体现在角色头像渲染器上:

在这里插入图片描述

角色的ID属性极其重要,在关卡间角色的属性继承存档读档剧情对话等一系列需要定位指定角色的功能,都是通过ID来确定的,所以ID不能重复,当然这里默认生成的Guid.NewGuid()是绝对不重复的。

只不过,为了方便后续关卡进行对应,主角的ID建议单独设置,比如某个主角ID为001,那么在所有关卡中,他的ID都必须为001

当我们把角色状态切换为Not Yet On Stage时,此角色将延时登场:

在这里插入图片描述

然后,下面列出了角色的8个要诀栏位对应的数据集,我们可以创建一系列要诀数据集,然后给每个角色都进行配置,4-8栏位会自动根据角色的等级进行激活,当然,也可以在后期使用要诀研习系统,为指定的角色学习任意要诀。

在这里插入图片描述

5.移动角色位置

如果我们想修改一个角色的位置,直接删了重新刷是一种笨办法,但因为角色的位置与其所处的地块存在直接关联,我们手动调节角色的位置自然是不可行的,所以需要实现控制角色移动的功能,比如:

        if (GUILayout.Button("上移", "ButtonLeft")){//保留角色所站的旧地块Block oldBlock = _currentSelectRole.StayBlock;//获取角色位置上方+1格的地块,为新地块Block newBlock = GetBlockByIndex(oldBlock.Pos + new Vector2Int(0, 1));if (newBlock != null && newBlock.StayRole == null){_currentSelectRole.transform.localPosition = new Vector3(newBlock.transform.position.x, newBlock.transform.position.y, -1);//交换新、旧地块的关联属性oldBlock.StayRole = null;_currentSelectRole.StayBlock = newBlock;newBlock.StayRole = _currentSelectRole;EditorUtility.SetDirty(oldBlock);EditorUtility.SetDirty(newBlock);EditorUtility.SetDirty(_currentSelectRole);}}

需要上、下、左、右移动功能,才能让角色可以变换到地图中的任意位置:

在这里插入图片描述

6.移除角色

同样的,自然需要移除角色的功能,我们在UI面板上已经画好了控件,只需实现对应的移除角色功能即可:

        /// <summary>/// 移除一个角色/// </summary>/// <param name="role">角色</param>private void RemoveRole(Role role){_roles.Remove(role);Block block = role.StayBlock;role.StayBlock = null;block.StayRole = null;//立即销毁角色物体DestroyImmediate(role.gameObject);EditorUtility.SetDirty(block);}

至此,角色编辑的功能便初步完成了,我们能够在关卡上任意布局角色编辑角色属性编辑角色要诀等,为后续驱动角色,进而驱动整个游戏逻辑打下了坚实的基础。

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

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

相关文章

台球厅助教软件开发台球陪练系统源码助教陪练行业市场分析

市场分析 随着台球运动的普及和竞技水平的不断提升&#xff0c;台球助教市场也逐渐成为了一个备受关注的领域。然而&#xff0c;如何高效、规范地管理这一市场&#xff0c;确保助教质量&#xff0c;提升用户体验&#xff0c;成为了摆在我们面前的一大挑战。幸运的是&#xff0…

8.计算机视觉—增广和迁移

目录 1.数据增广数据增强数据增强的操作代码实现2.微调 迁移学习 Transfer learning(重要的技术)网络结构微调:当目标数据集比源数据集小得多时,微调有助于提高模型的泛化能力。训练固定一些层总结代码实现1.数据增广 CES上的真实故事 有一家做智能售货机的公司,发现他们…

pytorch国内镜像源安装及测试

一、安装命令&#xff1a; pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple 二、测试&#xff1a; import torch x torch.rand(5, 3) print(x)

展厅设计装修公司应该具备的基本条件

1、成立的年限 成立年限越长的公司代表其展厅设计行业经验越丰富&#xff0c;在选择设计装修公司的时候一定要选择有充足经验的设计装修公司。资质好的设计装修公司&#xff0c;必定为大型的展览会做过设计装修。这样就不会在展会的设计装修上产生太多的成本问题&#xff0c;能…

基于jeecgboot-vue3的Flowable流程-加签功能

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、加签功能对话框代码 这里注意vue3与vue2不同的地方&#xff0c;需要v-model:value&#xff0c;否则获取有问题。 <j-select-user-by-dept class"userSelect" v-model:va…

应急响应靶机-Linux(1)

前言 本次应急响应靶机采用的是知攻善防实验室的Linux-1应急响应靶机 靶机下载地址为&#xff1a; https://pan.quark.cn/s/4b6dffd0c51a 相关账户密码&#xff1a; defend/defend root/defend 解题 第一题-攻击者的IP地址 先找到的三个flag&#xff0c;最后才找的ip地址 所…

成都百洲文化传媒有限公司专业电商服务的典范

在电商风起云涌的时代&#xff0c;成都百洲文化传媒有限公司凭借其深厚的行业经验和独特的创新思维&#xff0c;成为了众多品牌电商之路上的得力助手。今天&#xff0c;就让我们一起走进成都百洲文化传媒&#xff0c;看看他们是如何在电商领域乘风破浪&#xff0c;助力品牌实现…

产品中心|高效能双处理器Xilinx FPGA 4通道射频收发板卡

1、产品概述 基于Xilinx XC7K325T芯片的4通道射频收发板卡&#xff0c;搭载高能效Cortex-A8内核处理器、1组16bit/2GB DDR3及1组4GB DDR3、 1组2GB Nand Flash、1路USB接口、4路高速ADC、4路高速DAC&#xff0c;支持外触发&#xff0c;外时钟。用于FPGA程序加载板卡工作温度范…

模拟题解析:

《互联网域名管理办法》第41条规定&#xff0c;域名根服务器运行机构、域名注册管理机构和域名注册服务机构应当遵守国家相关法律、法规和标准&#xff0c;落实网络与信息安全保障措施&#xff0c;配置必要的网络通信应急设备&#xff0c;建立健全网络与信息安全监测技术手段和…

springboot项目requestId设置、统一responsebody封装以及切面

利用filter设置requestId import cn.hutool.core.lang.UUID; import lombok.extern.slf4j.Slf4j; import org.slf4j.MDC; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.s…

8.12 矢量图层面要素单一符号使用八(形状炸裂填充)

文章目录 前言形状炸裂填充&#xff08;Shapeburst fill&#xff09;QGis设置面符号为形状炸裂填充&#xff08;Shapeburst fill&#xff09;二次开发代码实现形状炸裂填充&#xff08;Shapeburst fill&#xff09; 总结 前言 本章介绍矢量图层线要素单一符号中使用形状炸裂填…

观测云产品更新 | Pipelines、智能监控、日志数据访问等

观测云更新 Pipelines 1、Pipelines&#xff1a;支持选择中心 Pipeline 执行脚本。 2、付费计划与账单&#xff1a;新增中心 Pipeline 计费项&#xff0c;统计所有命中中心 Pipeline 处理的原始日志的数据大小。 监控 1、通知对象管理&#xff1a;新增权限控制。配置操作权…

制造业“智改数转”背景下,产品经理考取NPDP证书的重要性

在“智改数转”&#xff08;智能化改造和数字化转型&#xff09;已成为推动制造业高质量发展的关键路径背景下&#xff0c;作为连接市场需求与产品实现的关键角色&#xff0c;产品经理的角色愈发重要。而考取NPDP&#xff08;新产品开发专业人士认证&#xff09;证书&#xff0…

2024年8月 PMP认证考试 7月9日正式开始报考

尊敬的各位考生&#xff1a; 经PMI和中国国际人才交流基金会研究决定&#xff0c;中国大陆地区2024年第三期PMI认证考试定于8月31日举办。 7月9日正式开始中文报考&#xff0c;在此之前需要完成英文资料注册&#xff0c;如果您想参加8月考试&#xff0c;还有最后10天报名即截止…

5G赋能安防视频监控:EasyCVR视频汇聚融合创新技术,共筑多场景安全防线

随着科技的快速发展&#xff0c;第五代移动通信技术&#xff08;5G&#xff09;已逐渐成为我们生活中的重要组成部分。其中&#xff0c;5G技术以其超高速、低延迟、大连接数的特点&#xff0c;正在深刻改变着我们的生活方式和社会运行模式。安防监控领域作为社会安全的重要组成…

深度學習筆記14-CIFAR10彩色圖片識別(Pytorch)

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習紀錄博客&#x1f356; 原作者&#xff1a;K同学啊 | 接輔導、項目定制 一、我的環境 電腦系統&#xff1a;Windows 10 顯卡&#xff1a;NVIDIA GeForce GTX 1060 6GB 語言環境&#xff1a;Python 3.7.0 開發…

ThreadX简介

文章目录 1. 摘要2. ThreadX的特性2.1 免费开源2.2 安全认证级别高2.3 组件完善2.4 实时性高2.5 支持多核2.6 支持应用动态加载2.7 代码符合MISAR规范2.8 文档全面,例程丰富2.9 集成方便3. 移植示例4. 产品应用示例1. 摘要 在嵌入式系统领域,实时性能、系统稳定性以及广泛的…

Camera开发-相机输出常用数据格式

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

JMeter安装与使用

安装包下载&#xff1a;https://pan.xunlei.com/s/VNigSM9IEjqNBVkw8by6i-LoA1?pwdu6gq# 也可以官网下载&#xff1a; 1.解压安装包 2.打开方式 &#xff08;1&#xff09;bin->ApacheJMeter.jar->打开界面 &#xff08;2&#xff09;如果&#xff08;1&#xff09;打…

LoadBalance 负载均衡

什么是负载均衡 负载均衡(Load Balance&#xff0c;简称 LB),是⾼并发,⾼可⽤系统必不可少的关键组件. 当服务流量增⼤时,通常会采⽤增加机器的⽅式进⾏扩容,负载均衡就是⽤来在多个机器或者其他资源中,按照⼀定的规则合理分配负载. 负载均衡的⼀些实现 服务多机部署时,开发⼈…