2016-08-23 17:29:07 mrma55555 阅读数 3042
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2378 人正在学习 去看看 杨石兴

1、什么是框架,为什么使用框架

  • 什么是框架
    可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。

  • 为什么使用框架
    说到为什么使用框架,那么我们就要谈谈使用框架的优势,以及框架能够带给我们什么好处。框架的优势在于便于维护我们设计的程序,当你的程序出现问题,或者需要添加功能时你可以很快的定位到应该添加功能到哪一个模块中。框架不仅给我们的程序构造了一种软件模型,还有很重要的一点是它给我们提供了非常丰富且实用的功能函数,这样可以大大提高我们的工作效率。需要明白的是,我们完全可以在一个文件中写上几千行几万行甚至更多的代码达到我们的目的,但这样的代码是不适合人类阅读的,它更适合机器去识别。需要注意的是:没有一种框架是可以应对一切设计需求的,当你所使用的框架不适合你的开发需求时,你应该果断的舍弃或者修改该框架去适应你的开发需求。

2、虚幻4Gameplay框架概述

  • Gameplay架构中类的关系图

Gameplay架构中类的关系图

  • 据该图,介绍一下该架构在RPG类游戏中类的职责对应关系。
    • GameMode是游戏架构的基类,负责设置游戏规则(如:玩家怎样才算获得当前关卡的胜利)。在虚幻引擎中具有运动形态(如奔跑、跳跃)的物体应设计成继承于Pawn的类。那么,玩家就是一个Pawn类,玩家拥有的各种战斗技能都应该设计在这个类中。而PlayerController负责维护玩家这个Pawn类的实例、处理从玩家获得的一些输入、实施一些控制玩家的Pawn的手段。
    • 如果玩家在某个地图中行走时,会有一些其他怪物(具有运动形态)对玩家进行攻击,那么这些怪物也应该继承于一个Pawn类,怪物的技能等功能应该在这个类中进行设计。但这个怪物Pawn的实例被AIController拥有(而不是PlayerController),因为怪物的攻击、巡逻等状态不受玩家控制,而是应该由AI控制(智能控制,自动处理)。
    • 在游戏过程中,屏幕中显示的玩家/怪物等状态信息应该在HUD类中进行设计。HUD(平头信息显示)、Input(玩家输入)、PlayerCameraManager(摄像机管理)同样被PlayerController拥有,PlayerController负责维持这些实例之间的信息交互。

3、基本游戏类介绍

  • 游戏场景中具有运动形态的物体
    • Pawn:框架中Pawn代表了一切具有运动形态的物体,即拥有运动形态的物体应该继承于该类。
    • Character:框架中Character继承于pawn,但设计为类人的,大多情况下游戏的主角(即玩家)应该继承于该类。
  • 游戏界面显示
    • HUD:框架下HUD是一种二维的屏幕显示信息,如玩家的生命值、分数信息等会在该类中进行绘制显示。
    • Camera:PlayerCameraManager是玩家的眼睛,管理玩家应该看到的具体游戏画面。
  • 游戏性逻辑控制
    • Controller:框架下Controller拥有一个Pawn类实例,负责控制该Pawn应有的行为。
    • PlayerController:框架下PlayerController继承于Controller,拥有一个Character/Pawn类的实例,本质上代表了人类玩家的意愿。
    • AIController:框架下AIController继承于Controller,拥有一个Pawn的实例,主要负责控制非玩家控制的有运动形态的物体。
  • 游戏规则设置
    • GameMode:GameMode拥有一个GameState实例,并负责定义游戏规则。如设定在何种情况下玩家会通过该关卡。
    • GameState:GameState关联了像玩家的列表、分数、象棋游戏中的象棋位置或者在开放世界游戏中已经完成的任务列表等数据,表示当前游戏的状态
    • PlayerState:PlayerState是游戏中的一个参与者的状态,比如人类玩家或者模拟人类玩家的机器人。作为游戏一部分存在的非人类玩家AI没有PlayerState。PlayerState中适合包含的示例数据有:玩家姓名、分数、像多人在线竞技场这样的比赛中的等级、或在夺旗模式游戏中玩家当前是否正占领旗帜。所有玩家的PlayerStates在所有机器上都存在(和PlayerControllers不同),并且可以自由地进行复制来保持同步。

4、游戏流程概览

  • 独立模式
    在 Standalone 模式中(在编辑器外进行的游戏使用该模式),引擎启动和初始化之后将立即对游戏所需的对象进行创建和初始化。诸如 GameInstance 之类的对象在引擎启用之前被创建和初始化(与创建和初始化引擎不同)。引擎的启动函数被调用后,将立即加载初始地图。关卡创建适当的 GameMode 游戏模式 ,然后创建其他 Actor 后,游戏进程便正式开始。

  • 编辑器模式
    编辑器模式由 Play In Editor 和 Simulate In Editor 使用,流程完全不同。引擎立即初始化并启动,因为需要它运行编辑器,但诸如 GameInstance 之类对象的创建和初始化将被延迟,直到玩家按下按钮启动 PIE 或 SIE 会话。此外,关卡中的 Actor 将被复制,使游戏中的变更不影响编辑器中的关卡,每个对象(包括 GameInstance)均有每个 PIE 实例的单独副本。在 UWorld 类中游戏进程开始时,编辑器路径和 standalone 路径再次结合。

  • 游戏流程图
    游戏流程图

  • 本文部分内容取自虚幻4引擎官方文档

2017-11-18 19:23:43 noahzuo 阅读数 1286
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2378 人正在学习 去看看 杨石兴

这篇博客介绍了我在Unreal Engine 4中通过Marching Cube算法来构建隐式曲面模型的过程,以及我的一些思考。


背景

前面的博客游戏《孢子》的思考 —— Marching Cube算法提到了Marching Cube的大致思路,剩下的就是如何在UE4中将其实现了。因此花了一天的时间将其在UE4中实现了一下。

效果图

以下效果图中,蓝色部分是使用Debug Draw方法绘制的三角形边。

这是球形曲面方程x2+y2+z2100=0的效果图(细分程度为10):

Image

这是曲面方程4x2+y2+z2100=0的效果图(细分程度为10):

Image

这是曲面方程x24+y24z=0效果图(细分程度为10):

Image

这是细分程度为20的图:

Image

依然存在的问题

以什么方式绘制顶点?

目前的做法是在Gameplay逻辑中运行Marching Cube算法,然后将得到的Density,Normal,Position信息传递到SceneProxy里面,然后在SceneProxy里面创建顶点并且绘制。

但是应该有更加高效的做法……

UV怎么处理?

一个很蛋疼的问题在于UV —— 该怎样生成一个比较合适的UV,从而获得一个比较好的效果?

在GPU Gems 3里面提到过类似的情况,不过是用于做地形的,并不普适。

在Stackoverflow上面有人提到过直接使用Enviroment mapping,就是在获得了Normal之后,直接通过(x/2+0.5, y/2+0.5)来作为uv。目前还没尝试过,不过可以试试看。

切线空间怎么构建?

因为UE4的渲染管线无法自定义,因此想要实现Gouraud Shading还是比较难的,这也就是上面的模型的光影看起来很奇怪的原因。

工具链怎么适配?

我原本想使用BlueprintNativeEvent作为曲面方程的函数,默认为一个圆曲面,用户可以重写对应的曲面方程。但是这种做法只针对于那些可以由BP继承的Component有效。由于这里继承自Mesh Component,因此无法进行由蓝图继承。

按这么说……看来只能使用Blueprint Interface来进行操作了?

Wireframe为啥显示不出来?

这条划掉,切线空间建立后就显示出来了……
很奇怪的,在Lit Mode与Unlit Mode下都可以显示,但是切换到Wireframe模式下,就显示不出来了……这一步需要进一步研究……

<全文完>

2014-07-24 21:11:24 u010153703 阅读数 1623
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2378 人正在学习 去看看 杨石兴

Unreal里的动画这么理解:

动画资源:AnimSequence, AnimMontage, BlendSpace...  其中,AnimSequence是我们导入的最基础的AnimClip,AnimMontage和BlendSpace都是在Unreal的Personal里用AnimSequence进一步制作的。

动画控制:AnimationBlueprint。 

AnimationBlueprint包含两部分:Anim Graph和Event Graph。  

Anim Graph: 动画状态转换(动画状态机)、动画混合(支持简单混合,目前还没有强大的混合树功能)。

Event Graph:可以自定义一些Event。或者处理某些AnimSequence、AnimMontage里插入的某些Event。

Unreal将角色逻辑和动画逻辑分开来处理,这样子处理有他的道理,只不过用户需要多了解Character和AnimInstance的通信机制。以CharacterBlueprint和AnimationBlueprint为例。

用户输入控制行走:

CharacterBlueprint里接受用户输入,由Character的MovementComponent得到Character的Speed。 而这个Speed是决定AnimationBlueprint里Idle-Walk-Run的参数。AnimationBlueprint如何从CharacterBlueprint获取信息呢?


其实看到了两种模式,(1)Try Get Pawn Owner节点得到当前的Player,由Player可以得到Velocity设置给AnimBP的Speed; 

(2)另一个就是需要做类型转换,将获取的Character转换为我们的MyCharacter,也就是我们已经用到的CharacterBP类型,此时就能获取MyCharacter 这个CharacterBP里的成员,变量、函数、Event,只要有访问权限,都能调用。

另外Try Get Pawn Owner节点可以换为Get Owning Actor节点。Get Owning Actor获取的是使用这个AnimationBlueprint的Actor。在这里这两个节点获取的对象是相同的。


动画状态机里一些动画状态的转换条件由AnimationBlueprint的一些Variable控制。而这些Variable又经常受用户输入影响,也就是这些Variable的值需要从CharacterBlueprint获取。 本质和前文的“用户输入控制行走”无差。


不用状态机转换,用Slot来控制:

需要制作AnimMontage,在AnimGraph里将Slot连接到Final Animation Pose。那么接下来不管是在AnimationBlueprint里的Event Graph里用Montage Play节点调用Montage,还是在CharacterBlueprint里用Play Anim Montage节点调用Montage,都可行!

注意,但在CharacterBlueprint里用PlayAnimMontage节点调用带RootMotion的Montage时,播放时可能会出现角色只出现位移没有播放相应动作的现象。 建议动画的处理还是尽量放在AnimBlueprint里。CharacterBlueprint只是告诉AnimBlueprint播放什么动画就好了。



完全不用AnimationBluerpint,直接在CharacterBlueprint里用Play Animation节点调用最原始的AnimSequence

注意,Play Animation节点是可以在CharacterBlueprint里用的,不过得注意去掉Context Sensitive。








2017-09-15 18:10:55 mykeylock 阅读数 1925
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2378 人正在学习 去看看 杨石兴

首先再熟悉一下python的参数传递:

对于不可变对象(number,string,tuple)作为参数时,相当于C语言的值传递;

对于可变对象(list,dict)作为参数时,相当于C语言的引用传递。

————————————————————————————————————————————————

A3C算法是Actor Critic算法的并行扩展。

为了训练一对Actor Critic,将其复制多份,复制的每一对各自训练,之后将每一对进行综合,

再然后将综合后的好的结果反馈给每一对复制出来的Actor Critic,一来一回能提高强化学习的学习效率。

首先新建一个公共网络,此公共网络里的参数可以被所有子网络共享。

(每个子网络进行训练,用这些子网络的梯度训练此公共网络的参数,进行一次梯度下降后,

将此公共网络的参数数值赋值给此子网络,然后继续这样的过程)

A3C算法充分利用了并行算法的优势,各个子网络可以训练不同的数据。

A3C与Actor Critic代码实现的最大的不同在于(根据莫烦python的github代码实现):

(1)并行计算下的参数、梯度共享

(2)A3C的Actor输出为表示分布的mu(均值)与sigma(标准差),这里直接根据分布来采样,

而不再是输出一堆概率来根据概率选择了。choose_action时直接sample一个。

————————————————————————————————————————————————

关于unreal算法,其在A3C的基础上增加了一些辅助性的训练。可以参考一个非常好的专栏:

http://mp.weixin.qq.com/s/1RPTloNXZ6K7TFL1leg6qg

2014-07-31 18:37:23 u010153703 阅读数 1187
  • 从这里开始虚幻4-Editor介绍 v4.18

    本课程系列取名英译系列,是录制人员参考国外英文原版经典教程,结合中国人的习惯录制而成。希望能够给大家以帮助。从这里开始虚幻4系列教程,是Unreal的官方发布的入门教学,非常经典,是学习Unreal的佳入口。

    2378 人正在学习 去看看 杨石兴
Unreal里的Input被我分为两类,(1)只控制Possesed Pawn的ActionEvent和AxisEvents,需要配合设置Project Settings里的Input。(2)可以控制整个场景的任何物体。用的比较多的是KeyEvents和MouseEvents,当然,如果你用摇杆外设,用的比较多的是GamepadEvents。

(1) ActionEvent和AxisEvents
在ProjectSetting的 Input里定义一堆键盘输入来做Action和Axis的Mapping。
在ProjectSetting里的Input有两种:
Action Events和Axis Events。
AxisEvent提供对应按键的Axis Value。


Action Event则不提供额外信息,只是触发事件。



(2) KeyEvents和MouseEvents
其实,还有很有用的Input种类是:KeyEvents和MouseEvents。


Action Events和Axis Events,按键消息只被Possessed的Pawn接收,也就是你只能控制PlayerPawn/PlayerCharacter。
但KeyEvents和MouseEvents的按键消息可以被场景中任何物体接收。

噢噢噢,有了KeyEvents,用来测试多么方便多么方便呀~ 


unreal4 源码引言

阅读数 256

Unreal中的捏脸

阅读数 225

没有更多推荐了,返回首页