自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 TouchInterface研究

最近有个需求就是自定义自定一个新的样式的虚拟手柄,这东西的学名一般叫Joystick,但ue4中则是以TouchInterface来称呼。而且ue4已经自带了默认的TouchInterface,配置方式在project setting——>input——>Mobile.打开这个资源后如下虽然UE4很贴心的为我们准备了Joystick但如你所见,我们只可以自定义配置ue4暴露出来的这些参数。有朋友说用蓝图继承右上角这个类行不行答案是不行蓝图的类型是blueprint,而这个

2021-05-24 18:32:52 792

原创 2.SluaUnreal和C++BP研究(二)

上篇文章写的比较乱,针对上篇文章的问题。我似乎找到答案了。之前有个概念是我模糊了。我一直把官方文档中的ReceivedBeginPlay事件认为是C++这边的BeginPlay事件的复写,但其实这是不对的。我们打开C++这边的Actor类的头文件搜索BeginPlay就能找到如下C++这边是有ReceivedBeginPlay事件的细心的朋友会发现这个ReceivedBeginPlay函数是个BlueprintImplementableEvent,这代表ReceivedBegin

2021-04-22 21:26:45 486

原创 1. 研究SluaUnreal中lua代码和C++BP的衔接关系

首先是结合使用的效果。1.使用Slua拓展蓝图我们知道如果要用SLua拓展一个Actor蓝图,需要让这个蓝图继承自LuaActor的C++类。继承后我们会在蓝图类的详情面板中看到下面这栏我们在LuaFilePath中填下拓展该蓝图类的Lua脚本在Lua目录下得相对路径即可。在使用中我们可以用self来访问该蓝图中的变量和方法。也就是说self是对原蓝图类的一层封装。值得一提的是在lua中我们实现原蓝图中同名方法时,在游戏运行时表现出来得效果是对蓝图方法进行覆盖。..

2021-04-03 19:53:49 683

原创 UE4.25在Android移动平台上部署事项

安装文档:https://docs.unrealengine.com/zh-CN/SharingAndReleasing/Mobile/Android/Setup/AndroidStudio/index.html下载3.5.3(下面第一个就行)安装安装完启动选择不导入配置这个是sdk目录疑难杂症: https://www.tektutorialshub.com/android-studio/haxm-installation-failed-i...

2021-03-29 20:17:57 484

原创 UE4代理和事件

UE4C++的代理delegate其实就是C#中的委托,其实是同一个东西只是C#里的教材里多数翻译成委托。代理其实就是一个可以传递函数指针的特殊类。UE4C++的代理还分为单播代理,多播代理,动态代理等。单播代理只能绑定一个函数//声明无参代理DECLARE_DELEGATE(D_NoParam)//声明1个参数的代理DECLARE_DELEGATE_OneParam(D_1Param, FString)//声明5个参数的代理DECLARE_DELEGATE_Fi.

2021-02-22 19:51:00 600

原创 UE4智能指针

在ue4引擎类中几乎有很大一部分的类都继承自UObject,继承UObject的类有很多特性,其中有垃圾回收,网络复制,反射,序列化,自己实现的运行时类型识别。而对于没有继承自UObject的类则不能在引擎关闭时自动进行垃圾回收。在这种情况下如果开发者不手动进行垃圾回收程序的内存很容易爆满,最终崩溃。 还有一种情况就是已有一个指针指向一块内存,开发者不小心释放了这块内存区域,但指针忘了赋空。导致形成野指针。以上的两种情况都是程序员在开发中遇到的问题。有个专业名词概括上述的情况——内存泄漏。.

2021-02-21 14:41:09 767 2

原创 关于UE4第三人称控制器的一些个人见解

在我们用UE4制作第三人称角色的控制的时候一般会蓝图如下从上面的代码来看我们用鼠标的xy轴控制controller。这个controller就是player controller,PC在UE4中是一个抽象的概念(好在UE在游戏运行会实例化这个controller)。在ue4中pawn是世界中含有移动方法的对象基类。玩家控制的角色就是pawn,character也是基于pawn的,也就是游戏中的角色。现实中的玩家要控制游戏中的角色就需要通过player controller。要..

2021-02-21 14:29:46 3623

原创 关于UE4C++框架子类扩展基类的的疑惑

在使用UE4C++编码的时候有些地方让我有点模棱两可。首先是在UE4C++编码时候我发现假如有一个UE4GamePlay框架的基类A,子类B继承A时。在基类A我发现实现了一个构造函数。子类B中也实现一个构造函数,但是这个构造函数里空空如也,如下:(子类前的A是UE4C++的风格 懂得都懂)AB::AB(){ // Set this character to call Tick() every frame. You can turn this off to impr

2021-02-21 14:21:24 276

原创 UE4联网6——UI同步

先看一下之前GameMode里的任务完成方法。最下面的那个是蓝图实现方法在单机版本中是在GameMode蓝图中显示UI在多人游戏中只有服务端会显示UI如下是使用专用服务器开的两个客户端(中间都没有显示UI),但是一个进入通关区域内的玩家视野变了,这符合上面PC的设置视野目标逻辑。如果一个玩家使用监听服务器,另一个玩家使用客户端呢?如下用客户端进入通关区域的时候客户端的视野变了,服务端的视野没变,服务端显示了UI客户端没显示。显示UI的逻辑是写在Gam...

2021-02-18 23:51:11 1506

原创 UE4联网5——GameMode复制多播函数

在这段代码中获取gm的时候服务器是能获取到的客户端得到的是空的因为gamemode只存在于服务器。所以客户端就不能调用角色的禁用输入和在屏幕上显示UI了。但是服务器上运行的这条代码在客户端上也运行了,这条代码属于后台运行所以我们要在客户端上调用上面的这个方法要怎么办呢?复制?可是客户端上根本就获取不到GameMode这个类实例。想要复制GameMode要用到UE4Gameplay架构中的的GameState这个类在编辑器中创建基于GameStateBase的C++类。..

2021-02-18 23:21:19 873 1

原创 UE4联网4——服务器变量更新回调函数

服务器变量更新需要更新UI的情况在联网游戏中经常需要用到。比如boss的血量在服务器上发生变化需要反应到各个客户端上。这就涉及到ReplicatedUsing标签的使用了。ReplicatedUsing 一般出现在函数的声明中,表示当该变量在服务器上变化时,会调用事先绑定好的回调函数(函数名一般以OnRep开头),需要注意的是服务端不会自动调用绑定好的该回调函数,此时需要通过代码手动调用.设置服务器变量变化后的回调函数ai状态的变化在服务器服务器需要手动调用改变状态 客...

2021-02-18 23:04:56 652

原创 UE4联网3——服务器设置

在前文中的测试都是在启用监听服务器中进行测试的,现在我们要在专用服务器中进行测试。并且角色蓝图中设置的模式是自动占有玩家。在play选项中把玩家人数设置成2的情况下是在 监听服务器获取玩家0,然后玩家1从天而降。(表现)我们应该在gamemode里面分配玩家。先把角色蓝图在场景中删除。打开worldSetting 分配角色蓝图并在场景中放置player start 的actorgamemode会在场景中遍历player start 随机找一个在该位...

2021-02-18 22:49:02 1173

原创 UE4联网2——视角同步

在做完子弹的同步后发现和客户端和服务器的玩家的仰角是不同步的。所以在角色代码中加入tick函数更新玩家的仰角pitch。这里我们需要用到一个变量RemoteViewPitch这是在pawn中定义的已经复制的公有变量(rpc)值得注意的是它是个uint8的 变量 所以只能存1~255的数字在复制的过程中需要对这个变量进行解压和压缩。查下这个变量的引用因为只能传输最大255的数值所以传给远端的时候要进行一个*255/360的缩放。所以我们这么写只在远端执行下面逻辑..

2021-02-18 22:37:39 461

原创 UE4联网1——子弹同步

首先在ue4中联机有个专业术语叫——Replication(复制)这保证服务器和客户端的实时同步,服务器会不断地向客户端发送更新数据。在ue4中射击类型的游戏在运行的时使用多个玩家,并在窗口上运行。会有一个窗口充当服务器,其余的时客户端在没有实现同步的时候,经常会给人一种很违和的感觉。比如客户端射击生成子弹在服务器这边则没有任何效果。服务端生成子弹在客户端上也没有任何效果。也就是服务端和客户端是不同步的。在子弹类构造函数中添加以下代码编译运行游戏,发现现在控制服务端角色...

2021-02-18 22:29:48 1435

原创 15.透明shader

首先透明的shader应该是最后渲染的,如果一开始就渲染有可能被场景中不透明的挡住。shader:// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'Shader "Custom/NormalMapShader-Frag"{ Properties { _Color("Color",Color) = (1,1,1,1) _MainTex("Main Tex",2D)

2021-02-17 17:30:00 247

原创 14.法线贴图shader

pixel = (normal + 1) / 2normal = pixel * 2 -1法线贴图存储rgba值 分别的取值范围是0~1而法线的取值范围是-1 ~ 1所以要经过上面的公式相互转换ps:法线贴图上的坐标对应的是切线空间下的法线方向 而不是模型空间下的。因为只是是模型的原点变了不同的模型中没个点的切线是唯一不变的。shader完整代码:// Upgrade NOTE: replaced '_Object2World' with 'unit...

2021-02-17 17:27:13 337

原创 13.贴图纹理shader

使用贴图来替换之前我们在shader的上由使用者更改的漫反射颜色(_Diffuse)shader代码:// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'Shader "Custom/TextureShader-Frag"{ Properties { _Color("Color",Color) = (1,1,1,1) _MainTex("Main Tex",.

2021-02-17 17:20:28 216

原创 12.unity内置函数

UnityCG.cginc中一些常用的函数//摄像机方向(视角方向)float3 WorldSpaceViewDir(float4 v) 根据模型空间中的顶点坐标 得到 (世界空间)从这个点到摄像机的观察方向float3 UnityWorldSpaceViewDir(float4 v) 世界空间中的顶点坐标==》世界空间从这个点到摄像机的观察方向float3 ObjSpaceViewDir(float4 v) 模型空间中的顶点坐标==》模型空间从

2021-02-17 17:02:39 345

原创 11.Blinn-Phong高光

Blinn-Phong高光模型的公式:Specular = 直射光 * pow(cosθ,高光的参数)θ是法线和x的夹角 x是平行光和视野方向的平分线shader代码Shader "Custom/MySpecularShader-Blinn-Phong"{ Properties { _Diffuse("Diffuse color",Color) = (1,1,1,1) _Gloss("Gloss",Range(8,...

2021-02-17 12:45:40 384

原创 10.高光反射Blinn

高光反射的公式:Specular = 直射光 * pow(cosθ,高光的参数) θ是反射光方向和视野方向的夹角由图像看出高光参数可控制光的可视范围逐顶点的高光反射// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Custom/MySpecularShader-Vert"{ Properties { ...

2021-02-16 18:46:21 439

原创 9.半兰伯特光照模型

前情提要:前面一节的漫反射实际上是根据兰伯特光照模型来进行实现的但这种做法有个缺点就是顶点法线和光的夹角大于90度的时候的成色是完全黑的这和我们生活中见到的事物是不一样的。所以就有了新的光照模型------半兰伯特光照模型。对比:兰伯特:Diffuse = 直射光颜色 * max(0,cosθ(光和法线夹角))半兰伯特:Diffuse = 直射光颜色 * (cosθ(光和法线夹角) *0.5 + 0.5)shader实现:// Upgrade NOTE: replaced.

2021-02-16 18:35:41 344

原创 8.光照模型(兰伯特光照模型)

什么是光照模型?光照模型就是一个公式,使用这个公式来计算在某个点的光照效果。标准光照模型在标准光照模型里,我们把进入摄像机的光分为下面几个部分自发光(Self-luminous)(如萤火虫) 高光反射(Specular) 漫反射(Diffuse)Diffuse = 直射光颜色 * max(0,cosθ(光和法线夹角)) 这个max 后面的0其实就是夹角大于90度的时候当做90度来处理。cosθ = 光的向量 · 顶点的法线 (向量的点乘)向量点乘和叉乘点乘:(标量...

2021-02-16 18:28:33 1032

原创 7.相机替换shader

原文:https://zhuanlan.zhihu.com/p/51080323shader代码:Shader "Custom/ReplaceShader"{ Properties { } SubShader { Tags { "RenderType"="ReplaceType" } pass { CGPROGRAM #pragma vertex vert

2021-02-16 18:16:59 317

原创 6.shader:语义 和VFACE使用

原文:https://zhuanlan.zhihu.com/p/50492287代码:Shader "Custom/TwoFaceShader"{ Properties { _FrontTex("FrontTex", 2d) = "white"{} _BackTex("BackTex", 2d) = "white"{} } SubShader { cull off Pass

2021-02-16 18:07:58 1216

原创 5.shader渲染管线和结构体

原文 https://zhuanlan.zhihu.com/p/49165180大白话渲染管线图形渲染管线之所以被叫做管线,就是因为它和一根管子的概念很像,我们可以理解为这根管子的末端连接的是我们最终的显示屏幕,管子的起始端连接的是我们的原始素材。把我们想展示在屏幕上的素材从起始端放入,然后素材通过管子经过一系列操作最终展示在屏幕上。而我们如果想加工一下素材最后的显示效果就可以在这根管子中做一些特殊的操作处理,以使素材经过我们所自定义的操作使其最终达到我们想要的效果。这根管子从头到尾大致

2021-02-16 18:02:11 176

原创 4.shader基本语法变量

属性部分https://zhuanlan.zhihu.com/p/47506575ps : 下面这个标签博主说了曲率 其实就是 一个幂函数的概念 y = x^3 maxY = 1Properties{ [PowerSlider(3)]_Float("我是Float", Range( 0 , 1)) = 0.5}subshaders主体部分在一个Shader中,可以有多个SubShader以及一个SubShader中也可以有多个Pass,但是一个Shader中必须要至.

2021-02-16 17:52:38 265

原创 3.shader的基本结构

编译器以及环境选择https://zhuanlan.zhihu.com/p/147176392这里我选择vs + hlsl tools for vs平时用vs写c# 感觉这套方案有高亮和代码补全和vscode那边差不多在vs里下了插件发现没效果虽然作者说可以使用https://stackoverflow.com/questions/62139190/are-there-any-visual-studio-2019-extensions-for-unity-shader-filesht

2021-02-16 17:32:46 271

原创 2.在unity中创建shader模板

知识提要:Mesh Filter : 存储一个Mesh(网格,模型的网格,就是模型的由哪些三角面组成,组成一个什么样子的模型,三角面的一些顶点信息)Mesh Renderer:用来渲染一个模型的外观,就是样子, 按照 mesh给它皮肤,给它颜色通过Material(材质)控制模型渲染的样子Material 贴图(可以没有,可以是一个单纯的颜色) Shader创建shader时的模板和打包容器(来自知乎tae)发现有几种shader选项...

2021-02-16 17:25:56 1756

原创 1.Shader初识

找了下网上适合入门shader的教材https://blog.csdn.net/u014732824/article/details/102959342https://www.zhihu.com/column/unityTA什么是shader?shader就是着色器,简单来说就是由开发者来自定义游戏里物体的渲染方式类似下下面小球的效果(来自知乎tae)Shader分为两类 :1. 顶点Shader(3D图形都是由一个个三角面片组成的,顶点Shader就是计算每个三角面片上的

2021-02-16 17:11:49 1609

原创 UGF结合demo的使用3--sound管理,设置窗口,过渡场景

Sound现在想要给游戏添加声音,在starforce工程里我们能找到各种音源文件,在config目录下能找到一个audio mixer 文件这个是对音源输出做些混响处理的,具体可以看看网上相关文档。再看下starforce上UGF预制体上的Sound节点是怎么设置的。在我的工程中也参照starforce设置了上面的 1 处 audio mixer 就是我根据音源文件在我的项目中手动创建的结构如下上面 2 处的是什么意思呢? 其实就是播放音源的代理 比如 我们的背景音...

2021-01-08 16:32:58 437

原创 UGF结合demo的使用2--UI制作,写UI逻辑,本地化语言相关

UI相关接着上篇文章继续进入菜单流程进入流程后打开菜单窗口成功打开菜单窗口后触发订阅的事件赋值m_MenuForm 为 菜单逻辑创建一个UI窗口会在这个窗口上添加两个脚本一个是这个窗口的自定义逻辑脚本,一个是UIform 的生命周期脚本再初始化UIform生命周期脚本时会获取这个UI上的逻辑脚本在每个周期阶段UIForm上执行的逻辑其实是需要调用逻辑脚本上的逻辑如上图我们在使用UI的时候只需要编写逻辑脚本就行了接着...

2021-01-08 16:18:20 496

原创 UGF结合demo的使用1--导入框架,数据表,配置,场景切换相关

再学习了基于UnityGameFrameWork的starForce后我想把UGF和我的demo做一个结合。同时也是学习的总结吧。首先在作者的github上下载UGF 这个工程 (ps:GF以动态库的形式存在于项目文件中的那个)这个工程中不需要再替换源码了避免使用者碰到不该碰到的东西。将框架从本地导入upm中接着构建几个基本的流程脚本实现一下初始化游戏并进入场景切换流程切换到菜单场景的操作。在上图中 1 的位置是我自定义的命名空间 在StarForce...

2021-01-07 00:50:00 988

原创 10. 有限状态机使用

虽然gf的流程底层是有限状态机,但这篇文章是要把状态机类如果和游戏中的角色状态一起结合使用。我们已经知道流程其实是对有限状态机进行了一层封装这个流程的周期函数的第一个参数其实就是IFSM<IProcedureManager> 类型的既然流程是一种特殊的状态机而游戏的角色都需要属于他们自身的状态机那能不能是这样假设我们为hero01设计的状态机类名为Hero01State我们能不能模仿流程的方式设计我们的英雄状态Hero01...

2021-01-06 20:23:47 252 1

原创 9. UI和事件订阅

来菜单流程看看加载UI的逻辑再这里主要是有两个步骤要做1是订阅UI打开成功后的事件2是打开UI逻辑底层是由事件类型的hash码分类的方法这不是一般的字典是是作者处理过的字典 值都是由链表构成的如果没有要载入的ui则要更新要载入的ab资源,并调用回调函数。看一下这个m_LoadAssetCallbacks回调函数他由其余几个回调函数组成。发现了载入资源成功的回调,看下在哪里用到。在生成资源...

2021-01-06 17:57:16 168

原创 8. 实体相关

实体Entity,指的就是游戏中由我们创建的游戏物体。StarForce里面实体的数据和逻辑是分离的,通过组件的形式组装到实体身上看一段创建小行星的代码以上的代码是从数据表中读取小行星的横纵坐标的位置在游戏中实例化出来。我们看一下实例化实体的方法,这个是实体组件的拓展方法。AsteroidData 就是实体的数据类Asteroid 是实体的逻辑类他们就是这样被实体组件给组装起来的这个Asteroid的底层是entity继承自en...

2021-01-06 17:37:48 236

原创 7.UGF热更流程

初始化资源函数查找一下引用有个初始化资源的流程,查找一下所有切换流程的调用。发现只有一处调用。这个是单机模式走的流程而我们想要探索热更的话我们要进入checkversion流程。作者这里的splash流程的含义应该是个风岔流程的意思。进入checkversion的流程,先订阅webrequest任务请求的成功和失败事件。然后添加webrequest任务请求 追踪到最后实际是往任务池里面加。请求成功的时候就会把服务器返回回来的参数进行反...

2021-01-06 17:12:08 358

原创 6.starForce资源加载总结

资源加载最后都是要经过这个函数无论是打开ui,生成游戏物体,加载配置表,跟踪到最后都会经过这个函数的。这几个参数就是之前资源加载成功后把资源进行分类的资源组所以资源加载的流程实际上是 下载成功资源后会进行个资源映射分组真正要在游戏中生成的时候要去映射表里找相应的参数对照的资源。...

2021-01-06 16:57:54 209

原创 5.资源加载非编辑器模式

知识补充:StreamingAsset: https://blog.csdn.net/qq_31967569/article/details/82851367unitywebrequire: https://blog.csdn.net/linxinfa/article/details/94436027注:上图来自烟雨博客在非编辑器下获取到的m_resourceManager.cs不是辅助器而是 resourceManager.cs 这个在上一节已经验证了。如下是资源初始化的入口:

2021-01-06 16:52:51 111

原创 4.资源加载编辑器模式

在ProcedureSplash流程后如果是在编辑器模式下直接进行加载不需要热更新编辑器下的资源一般是最新的。首先在编辑器下模仿非编辑模式的时候要把这个勾去掉所以找资源加载相关的就要打开这个代码看看。找到相关引用处进去再找到应用到的代码段如上如果是 编辑器模式 就选择把 编辑器资源辅助器 作为 资源管理者 ,否则获取 资源管理者模块 作为 资源管理者。看看EditorResourceHel...

2021-01-06 16:40:50 191

原创 3.从流程和组件深入GF框架

早在我没有发现启动场景的时候,我先发现了gameframework的那个预制,我想启动游戏的时候首先遇到的一个问题就是流程,我已经在前文提到过。StarForce的启动场景中也有gameframwork这个预制只不过是已经经过作者加工组装之后的这点还是很好辨认出来的。builtin部分就是gameframework预制体了这是流程组件节点Procedure 进入代码看看就知道确实是继承gf的组件类的很明显这里勾选的是整个游戏启用的所有流程,entrance proc...

2021-01-06 01:21:14 1004

空空如也

空空如也

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

TA关注的人

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