自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 【AI】行为树(Behaviour Tree)

接上篇,AI预定义逻辑可以把条件和行为逻辑看成一个Task,一个AI有多个Task,行为树把单个Task中条件和行为、多个Task之间的关系进行细分成节点关系,通过树形结构来分层,系统每帧从树的根向下遍历,根据各节点的功能来执行子节点。行为树主要由以下四种节点抽象而成组合节点、装饰节点、条件节点、行为节点。①组合节点(Composites)主要包含:Sequence顺序条件,Selector选择条件,Parallel平行条件以及他们之间相互组合的条件。②修饰节点(Decorator)

2021-05-24 19:25:23 2193

原创 【AI】FSM有限状态机

在设计游戏AI时,我们需要找到一个简单,可扩展的编辑逻辑的方案,从而加速游戏开发的迭代速度。案例:一个怪物在指定路径巡逻,当玩家怪物与玩家距离小于等于5米时会追逐玩家,当大于5米时会继续巡逻。这里就分为了巡逻、追逐两种状态。FSM状态机主要使用多态来实现扩展。首先状态切换一般分为三种进入状态触发、保持状态时触发,离开状态触发,进而我们创建基类:FSMStatepublic abstract class FSMState{ protected int stateID; pr

2021-05-18 19:08:33 790 4

原创 UnityECS学习日记二十三:BlobAsset

BlobAsset本质上是容器,可以通过引用访问不可变数据,是unity内部用来处理物理的东西,形状碰撞数据,其点,动画数据,曲线等 使用拥有的任何类型的不可变数据,没有线程安全问题。BlobArray:包含多个数据实例的普通数组BlobPtr指针:指向单个实例的简单指针BlobString:存储字符串上篇通过对实体添加 DynamicsBuffer ,来实现“列表”的概念,如果想多个实体公用一个“列表”,则需要Blob资产来实现。比如:一群敌人按照指定路线进行寻路,则 DynamicB

2020-05-25 23:29:21 2085 2

原创 UnityECS学习日记二十二:DynamicBuffer Component(动态缓冲区组件)

在ECS中通用组件只能存储值类型而没有引用类型,因此我们无法定义数组或列表。unity提供了DynamicBuffer的方式。如下:using UnityEngine;using Unity.Entities;[InternalBufferCapacity(3)]public struct IntBufferElement : IBufferElementData{ public int value;}public class TestVae : MonoBehaviour{

2020-05-22 14:20:40 1333

原创 Unity接入Google广告(AdMob)

1.首先你能够连接海外的网络(VPN)2.打开官网文档:https://developers.google.com/admob/unity/start?hl=zh-CN先进行注册,自己创建一个应用便可以获取到应用ID3.将Unity的插件导入你的项目中,注意整个流程都必须是你的网络连接着外网(开着VPN)。要不然会文件下载缺失!4.然后按照官方文档的步骤进行操作就可以了(一定要...

2020-05-21 00:16:05 4390 2

原创 UnityECS学习日记二十一:ECS + Graphics优化渲染sprite动画

using UnityEngine;using Unity.Entities;using Unity.Transforms;using Unity.Collections;using System.Collections.Generic;using Unity.Mathematics;[UpdateAfter(typeof(SpriteSheetAnimation_JobSyste...

2020-04-23 11:59:10 3605 1

原创 UnityECS学习日记二十:ECS+Graphics渲染简单sprite动画

使用的是Entities(0.9.1)版本,渲染sprite动画需要自定义着色器,将动画图集进行分割然后分帧显示在实体位置。如上图,通过实体控制器创建实体,然后使用Graphics API进行渲染,通过自定义着色器,每帧进行判定切换显示UV范围,实现动画效果。自定义Shder:支持GPU实例化Shader "Custom/InstancedShader"{ Prope...

2020-04-21 15:28:20 2451

原创 UnityECS学习日记十九:UnityECS的特性(Attribute)

特性(Attribute) 修饰类型 功能(待定表示还待补全) [AlwaysUpdateSystem] Class 总是更新系统 [BurstCompile] Struct Burs编译(Job结构体) [ReadOnly] NativeArray 只读模式,速度更快 [NativeDisableParallelForRestric...

2020-01-19 21:06:13 754

原创 UnityECS学习日记十八:SubScene场景解决方案

对于大型场景我们如何预先摆放在unity的world中呢?unity提供了SubScene,如下图:当前SubScene是编辑状态下,可以看成预制体的方式,方便修改,一个world可以多个SubScene进行加载,个人认为节省了将Gameobject转换为实体的步骤。1.当你保存一个场景,Unity会将SubScene转换成一个原生的二进制格式,这个格式对内存而言是可...

2020-01-10 15:51:00 4923 1

原创 UnityECS学习日记十七:UnityECS多种组件类型

UnityECS的组件是专门用来存储数据的数据结构一般继承自IComponentData接口,当然Unity还提供了其他类型组件。1.IShareComponentData接口,定义共享数据组件。using Unity.Entities;using UnityEngine;public struct OtherComponentData : IComponentData{}...

2020-01-06 00:00:13 791

原创 UnityECS学习日记十六:UnityECS使用EntityQuery(实体筛选器)

ECS中所有实体以ID的方式进行存储,正常游戏物体要分很多种类型,还要对不同类型分别进行操作,这就需要筛选器来获取你想要的操作的实体对象进行修改数据。案例十四:EntityQuery(实体筛选器)(Scne15)用到的ComponetData:using Unity.Entities;public struct ComponentA : IComponentData{ ...

2020-01-02 23:31:30 1764

原创 UnityECS学习日记十五:UnityECS中EntityCommandSystem在主线程中的使用

前边讲了在Job中动态创建需要EntityCommandSystem来实现,而在主线程中的Foreach中也是要使用Unity指定方式PostUpdateCommands来实现:案例十三:主线程使用实体缓冲命令创建物体(Scne14)脚本:EntityBuffer_Prefabusing System.Collections.Generic;using UnityEngine;u...

2019-12-29 23:44:36 547 1

原创 UnityECS学习日记十四:UnityECS的System执行顺序(必读!)

如同Unity的Monobehaviour一样,UnityECS也有自己的生命周期,并且工作中对逻辑处理也要进行区分执行顺序。ComponentSystem与JobComponentSystem中的OnUpdate都是每一帧执行。区别是前者在主线程,后者在子线程运行,并且当job中筛选出来的Entity(实体)数量大于0时才会被调用。如下图Unity提供了三种分组:如图上,Unity又在各...

2019-12-27 23:34:16 1430

原创 UnityECS学习日记十三:Job中动态创建实体(实体命令缓冲系统)

在以前的案例中,通常实体都是在主线程进行动态创建的,而想在Job中进行动态创建,Unity提供了EntityCommandBuffer(实体命令缓冲)概念,它解决了两个问题:1.在Job中无法访问EntityManager。2.当访问EntityManager时(例如,创建实体),将使所有注入的数组和EntityQuery对象无效。案例十一:Job中创建实体模拟细胞分裂(Scne12)...

2019-12-26 23:39:23 963

原创 UnityECS学习日记十二:Unity Job System中IJobChunk的使用

内存块(IJobChunk),这个块是被一开始基于相同原型分配好了的,也就是说,如果实体有相同的组件,那么他们会被紧密的安排在一块内存中,从而方便处理器进行操作。这是相对于面向对象的散列内存而言的,在面向对象中要操作内存中的某个对象时,你不得不在整个内存中寻找它,这样会降低读取速度,也不方便批量操作。ECS则会非常紧密地分配实体在内存中的位置,相同的组件会被统一放在块中,读取速度快,也方便批量操作...

2019-12-24 14:47:05 1548

原创 UnityECS学习日记十一:UnityECS与Unity Job System使用

使用实体组件系统和作业系统一起使用让性能起飞!案例九:UnityECS和Job系统模拟雨滴降落(Scne10)脚本:PureJob_DropDatausing Unity.Entities;[System.Serializable]public struct PureJob_DropData : IComponentData{ public int velocity;...

2019-12-23 18:29:12 598

原创 UnityECS学习日记十:Unity Job System 之 Job组合关系

上篇提到:如果一个job有多个依赖项,你可以使用JobHandle.CombineDependencies方法来合并他们。CombineDependencies允许你将他们传递给Schedule方法。例如生活中想要煮面条,我们要向锅中加入水,然后等水烧开才能下面条,下面条就要依赖:加水、水烧开这两个条件,JobHandle结构体提供了静态方法来实现,它返回的也是个JobHandle。案例...

2019-12-23 15:17:39 771

原创 UnityECS学习日记九:Unity Job System 之 Job依赖关系

多线程开发,数据加载与计算也是在主线程基础上分前后顺序的,这里就要了解Job间的依赖关系。JobHandle和依赖关系:当你调用Schedule方法时会返回一个JobHandle。你可以在代码中使用JobHandle作为其他jobs的依赖关系。组合依赖关系:如果一个job有多个依赖项,你可以使用JobHandle.CombineDependencies方法来合并他们。Combine...

2019-12-23 14:49:06 1028

原创 UnityECS学习日记八:Unity Job System 之 IJobParallelFor 多线程并行化

上篇提到:IJOB接口是一个一个的开线程任务,因为数据是顺序执行的所以它可以保证正确性。如果想让线程人物真正的并行,那么可以采用IJobParallelFor。案例六:IJobParallelFor多线程并行化控制指定数量cube向上移动(Scne7)脚本:JobParallelForTestusing UnityEngine;using Unity.Jobs;using Uni...

2019-12-23 00:37:38 4269

原创 UnityECS学习日记七:Unity Job System 之 IJob 多线程接口

上篇提到NativeContainer托管的数据类型,为Unity线程和job线程进行数据交换,它的内存分配有三种分配类型,当初始化时需要指定一个合适的分配器。有:1.Allocator.Temp是最快的分配类型。它适用于分配一个生命周期只有一帧或更短时间的操作。你不应当把一个分配器为Temp类型分配的NativeContainer传递给jobs使用。你同时需要在函数返回之前调用Dispose...

2019-12-22 02:12:17 1758

原创 UnityECS学习日记六:Unity Job System

前几篇提过ECS系统的好基友:Unity Job System ,这个是untiy为我们提供多线程开发的基础库。先前说过我们平时Update多是单线程开发,unity早就支持多线程开发。而c#的多线程开发中子线程不能操控UI线程。我们需要了解什么是多线程开发:1.上下文环境隔离比如妈妈拿钱让小孩去打酱油,钱对于妈妈来说不再控制了,上下文运行环境是隔离的。2.进程同步技术比如妈妈...

2019-12-21 01:01:24 771

原创 UnityECS学习日记五:Hybrid(混合)ECS

案例四:Hybrid(混合)ECS动态创建指定数量的小球Entity(实体)(Scne5)Hybrid编程 GameObject转变为实体,使用unity的预制体来动态创建数量级雨滴下落。在上篇的基础上,将Unity预制体加入代理来实现。脚本:DropData_Hybridusing Unity.Entities;[System.Serializable]public str...

2019-12-20 00:25:07 2679 3

原创 UnityECS学习日记四:PureECS(纯ECS开发)

案例三:使用Entity小球模拟数量级雨滴效果(Scne4)本案例将结合上篇动态创建小球和第二篇学的ComponentSystem(组件系统)来模拟雨滴产生和下落过程,首先雨滴下落逻辑图:脚本:DropDatausing UnityEngine;using Unity.Entities;using Unity.Mathematics;[System.Se...

2019-12-19 00:53:00 1215

原创 UnityECS学习日记三:PureECS(纯ECS开发)

案例二:PureECS(纯ECS)动态创建指定数量的小球Entity(实体)(Scne3)脚本:PureMainusing System.Collections;using System.Collections.Generic;using UnityEngine;using Unity.Entities;using Unity.Collections;using U...

2019-12-17 20:50:05 1221

原创 UnityECS学习日记二:HybridECS(混合ECS开发)与PureECS(纯ECS开发)

UnityECS框架又分为:HybridECS(混合ECS开发):这个会和原来的MonoBehaviour组合开发,中间需要一层代理来实现,性能肯定不如PureECS。PureECS(纯ECS开发):这就要你重新接受一种新的开发思维,性能最好。注意:我使用为Unity2019.1.6f1版本 ,直接在包管理器中使用Entities33版本目前我这最高的,有的人左下角loading加载时...

2019-12-17 15:14:19 2650

原创 UnityECS学习日记一:UnityECS与传统开发方式的区别

目前程序开发分为:面向过程开发(c 语言 ),面向对象开发( unity传统开发方式 ),面向数据开发(ECS)大致这三种。Unity官方2018开始,推出了DOTS(多线程式数据导向型技术栈),其中分别用到的技术:ECS 、Jobs System、Burst 。首先要明白UnityECS开发方式和传统开发方式区别是如何提高游戏性能的:传统的GameObject系统:传统开发...

2019-12-17 02:44:17 2256

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除