技能系统(Unity 3D)——学习笔记(三)
技能系统(Unity 3D)——学习笔记(三)
- 前言
- 笔记
- 1. 框架
- 2.功能
- 3.技能数据类
- 4.技能管理器
- 5.技能资源映射表
- 6.资源管理器
- 7.对象池
- 8.释放器
- 9.选区算法
- 10.影响算法
- 11.类图
- PS.涉及到的C#机制
前言
前几个月都在忙着秋招和提前批找工作,没有精力更新博客的内容。现在,秋招逐渐正式开始了,有了足够的精力来更新博客的内容了。
由于,之前用unity3D做游戏demo的时候,发现技能系统属于一大难点,因此,单独针对该系统进行学习,主要基于各位大大的视频和资源。
附上大佬的视频:https://www.bilibili.com/video/BV1WJ411T7YQ?p=6
笔记
整体流程:攻击方对象挂载技能管理组件、角色状态类(脚本)。技能管理组件管理技能数据对象,准备需要释放的技能的状态,动态创建技能预制体对象。技能预制体对象上挂载技能释放器组件,完成以下工作:播放相应的攻击动画,执行攻方消耗,选择攻击目标,生成技能攻击特效对象,执行伤害算法,播放受击方动画。
1. 框架
整个技能系统分为攻击者,技能,被攻击者三个对象。
攻击者:技能管理器(脚本),角色状态数据(类),技能数据(类)。
被攻击者:角色状态数据(类)。
技能(预制体):技能数据(类),技能释放器(脚本),角色状态(类)。
2.功能
技能管理器:负责管理技能列表,并且生成技能。
技能释放器:创建技能对应的算法,执行对应算法,实现对攻击者和被攻击者角色状态类
3.技能数据类
包含技能所需的所有数据,比如:1.技能ID;2.技能名称;3.技能描述;4.冷却时间;5.冷却剩余;6.魔法消耗;7.攻击距离;8.攻击角度;9.攻击目标Tags(所属);10.攻击目标数组;11.技能影响类型;12.连击编号;13.伤害比率;14.持续时间;15.伤害间隔;16.技能释放者;17.技能预制体名称;18.技能预制体对象;19.动画名称;20.攻击特效名称;21.攻击特效预制体;22.技能等级;23.攻击类型(单个目标,多个目标);24.选择类型(扇形,矩形)。
4.技能管理器
1.管理技能列表;
2.Start():根据技能名称Load技能预制体;
3.perpareSkill:根据技能ID找到SkillData,由SkillData类的CoolRemain和costSP判断是否可以生成技能;
4.generateSkill:实例化技能,摧毁技能,技能冷却。
5.(协程)CoolTimeDown:在技能释放以后开启协程,改变剩余冷却时间。
5.技能资源映射表
管理技能资源和资源完整路径的对应关系。
注意点:
1.编译器代码:继承于Editor类,只需在Unity编译器中运行的代码;
2.菜单项特性[MenuItem("…")]:用于在Unity编译器中产生菜单按钮;
3.AssetDatabase:包含了只适用于编译器中操作资源的相关功能。
4.StreamingAssets:Unity特殊目录之一,该目录的文件不会被压缩,适合在移动端读取资源。
6.资源管理器
管理资源的读取,通过资源的名称,加载资源的路径,返回资源的预制体对象。
7.对象池
思想:基于通过空间换时间的思想实现对象的循环使用。
适用场景:频繁创建/销毁对象的场景。
数据结构:Dictionnary<string,List<GameObejct> > ------>不同类型的多个对象,string确定对象类型,list确定对象数量。
核心成员:
1.通过对象池创建对象
CreateObejct(string key,GameObejct prefab, Vector3 pos,Quaternion rotate)
{在池中查找是否有禁用的物体{如果没有禁用物体,创建对象;加入池中}使用对象{设置位置/旋转;启用物体}
}2.回收对象
CollcetObejct(GameObject go)
{禁用对象
}
8.释放器
释放器整体逻辑:
(1)技能数据;
(2)初始化对象(创建算法对象);
(3)释放技能:1)调用影响效果;2)调用选区算法。
9.选区算法
选区算法整体逻辑:
(1)根据可攻击目标的标签 获取所有目标
(2)判断目标是否在攻击范围;
(3)判断目标是否存活;
(4)返回被攻击的目标(单攻/AOE)。
- 基类:
- 派生类
10.影响算法
选区算法整体逻辑:
(1)基类设置执行方法接口,传入技能释放器对象;
(2)子类实现方法。
基类:
派生类
11.类图
PS.涉及到的C#机制
1、委托:
2、垃圾回收机制(GC)
(1)定义:针对于内存而言的,通过遍历堆上动态开辟的对象,识别对象的引用计数,定时完成内存的回收。
(2)Java和C#中GC的区别:
Java:采用虚拟机(VM)的机制,由虚拟机管理程序运行和垃圾回收。
C#:采用CLR(Common Language Runtime)管理垃圾回收。
(3)GC出现的原因:
1、提高了软件开发的抽象度;
2、程序员可以将精力集中在实际的问题上而不用分心来管理内存的问题;
3、可以使模块的接口更加的清晰,减小模块间的偶合;
4、大大减少了内存人为管理不当所带来的Bug;
5、使内存管理更加高效。
总结而言:不用程序员完成内存管理,交由系统自动完成。
(4).NET的GC机制存在的问题及注意事项:
- 不能释放非托管资源;
- 非实时的方法,提供Dispose方法供程序员显式的释放非托管资源。
- GC通过从程序的根对象开始遍历来检测一个对象是否可被其他对象访问(引用跟踪算法),而不是用类似于COM中的引用计数方法。
- .NET GC使用"代"(generations)的概念来优化性能,代帮助GC更迅速的识别那些最可能成为垃圾的对象。代的作用是为了区分局部变量和需要在应用程序生存周期中一直存活的对象。GC对不同代的对象执行不同的检查策略以优化性能。每个GC周期都会检查第0代对象。大约1/10的GC周期检查第0代和第1代对象。大约1/100的GC周期检查所有的对象。
(5)引用跟踪算法:
采用对象可达图判断对象是否为垃圾。首先将所有的对象标记为垃圾并将它们视为根,从根出发,将所有的正在使用的对象串联起来,直至完毕,不被串联的对象即为“不可达”,即被视为垃圾,”可达” 的对象则被认为是有用的,在垃圾回收的过程中幸存下来。在堆栈与托管堆的交互中,托管堆中有对象和同步块索引,根据遍历堆的对象改变托管堆中同步块索引。
3、反射机制
(1)定义:运行时类型信息方式。.Net的应用程序的三部分:程序集(Assembly)、模块(Module)、类型(class),而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息。
(2)实现:
- 通过得到实例对象,调用GetType方法,返回实例的Type对象的引用。
- 通过typeof()方法获取一个类型的Type对象引用。
(3)作用:
- 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型;
- 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射;
- 反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。
技能系统(Unity 3D)——学习笔记(三)相关推荐
- Unity 3D学习笔记之一 界面介绍
因为学校的课程,本学期对Unity 3D有学习的要求,在博客中记录下自己的Unity学习之路(内容摘录自书本和视频,书本为Unity 4.x从入门到精通) 一.Unity界面介绍 首先进入U ...
- Unity 3D学习笔记(5)物体的碰撞/触发检测
前言 在学习了刚体组件后,我们看到了物体的物理效果,比如重力,碰撞等等,那么该如何检测他们之间的碰撞呢? 在Unity中,有碰撞检测和触发检测两种类型,他们的简单概括如下: 一.碰撞检测 1.如何使用 ...
- Direct 3D学习笔记三:矩阵
仍然是基于先前的程序. 首先来介绍三个基本的矩阵,这是direct 3d中必须设置的三个矩阵,即世界矩阵,视图矩阵,投影矩阵.而对应的三个变换就是世界变换(World Transform),摄 ...
- 【Unity 3D学习笔记】PD 过河游戏智能实现
P&D 过河游戏智能帮助实现 实现状态图的自动生成 讲解图数据在程序中的表示方法 利用算法实现下一步的计算 对于过河游戏,首先需要知道其中各个状态之间的转换关系,绘制状态转移图如下: 其中,P ...
- Unity 3D学习(三)——打砖块
本讲进行Unity的第二个案例练习,预计10个小时,会同时更新博客.熟悉Unity的一些简单操作. 1 搭建环境 1.1 设计地面 首先,创建20x20一个平面,平面Plane默认是10x10的,所以 ...
- Unity 3d 学习笔记
如何应用左手法则决定视图,应用 Field of view 设置场景大小. 1.场景视图的右上角是场景Gizmo,这个显示场景相机的当前方向,并允许你迅速修改视图角度,Unity中默认是左手法则视图. ...
- Direct 3D学习笔记(三)——光照与材质
Direct 3D学习笔记(三)--光照与材质 现实世界中物体的颜色是一个复杂的系统,物体在不同的光照下,可能呈现在我们面前的就是不同的颜色.根据物理中的光学知识,物体在各种环境光照下,根据物体自身特 ...
- Unity DOTS 学习笔记1 - ECS 0.50介绍和安装
Unity DOTS 学习笔记1 - ECS 0.50介绍和安装 为什么学习这个技术 ECS的全称为Entity Component System,是最早由暴雪在GDC2017上提出的一个新的游戏设计 ...
- OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移、缩放和旋转操作
OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移.缩放和旋转操作 C3DWidget.h #pragma once#include <QtWidgets/QApplic ...
- J2EE学习笔记三:EJB基础概念和知识 收藏
J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...
最新文章
- 走在网页游戏开发的路上(八)
- 有限算法下的技术实现路线
- MySQL 5.7 并行复制实现原理与调优
- 每日程序C语言7-将一个正整数分解质因数
- centos 对已有卷扩容_centos7 逻辑卷扩容
- [android] AndroidManifest.xml【 manifest - permission-tree 和 manifest - permission-group】
- clear ,refresh,free
- 硕士可以跟别的导师做实验吗_如何成为一名导师可以成为双刃剑
- 文件上传java前端怎么写_做一个文件上传,前端是ajax提交数据后台是java,这个错误怎么办...
- ++递归 字符串全排列_剑指 Offer 38. 字符串的排列
- python 字典查找效率_Python字典查找性能,get-vs-in
- VMware开启虚拟化实现CentOS创建KVM
- html和css最全的知识点归纳总结,html和css的面试知识点总结(附示例)
- PDF转Word方法大盘点:看了这一篇,就不用再找转换技巧了
- Adobe photshop 安装过程中的问题
- IDEA的设置(背景颜色、字体大小、注释颜色)
- IDEA2022版本没有“import Maven projects automatically”怎么办?
- 冯·诺依曼体系结构是什么
- 解决Vagrant启动虚拟机内存爆满
- 怎么使用计算机播放音乐,怎么用Apple Watch控制电脑播放音乐?
热门文章
- 网络工程师有什么发展?
- 贵如油的春雨都是润物细无声的么?——记2021年首场大范围雷雨强对流天气
- Wox and Everything
- 查询失败,后台服务器运行错误,添加网络打印机错误?怎么处理?Windows 无法连接到打印机。 服务器打印后台处理程序服务没有运行。...
- 主程玩失踪,公司蒸发600w,创始人秒变打工仔(含视频)
- 【学术】 一个博士的经历(小木虫精华帖,留着细细体会!)
- java计算a+aa+aaa+aaaa的和
- Windows7系统优化(批处理)
- 关于重装系统后开始菜单栏anaconda3文件夹消失问题的解决办法
- 机器学习笔记一. 特征工程