2015-11-14 13:03:01 xi_niuniu 阅读数 3165
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

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

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

Unreal Engine 4 蓝图脚本学习,根据《Blueprints Visual Scripting for Unreal Engine》学习整理


默认情况下,actor的Transform组件中 移动性属性为“static”,  就是在游戏运行时,actor是不可进行移动和操作的。所以为了实现对象
在游戏中可移动的效果需要把这一属性修改为 "可移动"




为了能够改变脚本以后所附加到的对象同样为可移动的,需要打开蓝图编辑器进行一些修改






为了使物体在游戏世界中能够移动,我们需要知道以下信息

•  Where the cylinder currently is 圆柱体在什么位置
•  What direction it is supposed to move in 想要移动的方向是什么
•  How fast it is supposed to move in that direction 在那个方向上移动的速度是多少

创建速度变量和方向变量

Speed 为float类型变量

Direction为Vector类型变量


速度设置 为200.0f;



移动方向设置为 y = -10.0f;





Normalizing is a common procedure in vector math that ensures that
the vector is converted to a length of one unit, which will make it compatible with
the rest of our calculations

标准化向量(单位化向量)就是将向量值转化到一个单位长度(向量的模为一)。以便在后序程序运算中相兼容



速度值乘以一个时间值,所以选择 float*float    时间值类型也为float


将StaticMeshComponent组件拖拽到事件图表中  以获取圆柱体当前的位置



GetWorldDeltaSeconds: 获取相邻两帧之间的间隔时间。 这个数值受游戏运行所在的机器性能影响的,性能高的机器时间间隔就较小,反之则较大。为了能够
在不同性能的计算机上表现出相同的移动速度,所以会把速度值乘以DeltaSeconds。



Transform属性中包含对象的 位置、  旋转 和 缩放的信息。 能过GetWorldTransform可以获得当前对象的Transform信息

BreakTransform 可以提取Transform中的不同部分
MakeTransform根据Location、Rotation和Scale "合成" 一个新的Transform


事件Tick每一帧都会触发

SetActorTransform 根据传入的Transform值设置Actor的Transform


这时运行游戏,圆柱体只会朝着一个方向移动。
为了实现圆柱体在游戏中来回移动,向事件图表中添加两个新的Direction 变量 ,选择设置并分别设置y值为10.0  和 -10.0


Delay会根据Duration设置的秒数循环执行
FlipFlop会执行 A 和 B所连接的Node 中的一个,默认先执行A。

播放游戏观察事件图表中数据流的走向


圆柱体在游戏中来回移动

现在通过之前创建的蓝图脚本可以创建更多且有相同属性的游戏对象











2015-11-13 19:42:51 xi_niuniu 阅读数 1404
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

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

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

Unreal Engine 4 蓝图脚本学习,根据《Blueprints Visual Scripting for Unreal Engine》学习整理

本篇博客主要内容是 射击添加到视口中的actor 并用自定义材质改变其颜色


创建一个基于FirstPerson蓝图模板项目

新建一个用于保存材质的文件夹


创建材质



































为Cylinder添加脚本
















播放运行最终效果



不过以上脚本还不完美。不仅子弹碰撞到圆柱体会变色,玩家和任何其它actor碰撞到圆柱体上都会变色。

在蓝图编译器器中做如下修改






这时只有子弹actor碰撞到圆柱体上才会变色


2015-11-21 11:23:21 xi_niuniu 阅读数 1134
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

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

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

Unreal Engine 4 蓝图脚本学习,根据《Blueprints Visual Scripting for Unreal Engine》学习整理

为了方便学习,通过以下设置将UE4调整为英语语言显示界面。



为了实现角色控制,找到 FirstPersonCharacter蓝图脚本并打开



模板自带的一些脚本node






添加输入映射





在Event Graph中空白处右键,这时就可搜索到我们刚在项目设置中添加的两个动作映射事件



角色的移动数据是在CharacterMovement组件中定义的



为了获取和设置角色移动数据需要把组件引入到事件图表中







这样就实现了按下左shift键盘角色冲刺的效果,类似穿越火线中的冲刺效果


添加望眼镜效果

FOV(field of view)的数据是在FirstPersonCamara组件中定义的所以将此组件拖拽到事件图表中

以设置Field Of View的值, 默认值为90


设置完成运行游戏查看效果

鼠标右键按下前



鼠标右键按下后





2007-10-14 18:33:00 sunicdavy 阅读数 3361
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

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

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

原文:

http://udn.epicgames.com/Two/UnrealScriptLanguageReference.html

 
将游戏逻辑放在脚本这样的沙盒(Sandbox)中,保护环境客户端调用,防止程序崩溃
 
虚幻脚本是:
类似java的无指针,自动垃圾回收机制
比C++更高级的时间,状态,属性和网络
 
 
引擎程序员使用C++写功能模块,并使用脚本封装成脚本可访问对象方法,脚本程序员根据游戏逻辑需求书写逻辑代码,并暴露可供调试和设置的属性,通过编辑器可以很方便的编辑和修改这些属性
 
需要花费时间的做事情的函数叫做延时函数,类似Sleep FinishAnim MoveTo等。延时函数只能在状态函数中调用,而不能是普通函数。普通函数只有在延时函数挂起时才能被执行
 
虚幻只是模拟windows的线程概念而非照抄,windows线程效率很低。
 
所有虚幻的对象脚本执行都是并行的,对象独立的
 
所有对象都继承于Object
Actor(继承于Object)定义了一些列诸如可控制的移动,交互和影响的行为
Pawn(继承于Actor) 一个拥有高阶AI和玩家控制级别的对象
Class(继承于Object) 定义了一类物体(有别于C++的class)
 
类定义修饰符:
Native:
表示其被C++后台支持,如果你有一个类为native Robots,虚幻将会在磁盘上需找Robots.dll实现脚本功能,前提是,C++类必须提供IMPLEMENT_CLASS宏定义
 
Abstrat:
         抽象类,类似于C++的接口类,接口类本身不能被实例化,子类必须实现其方法方可实例化。在虚幻脚本中有一个Pawn类,其本身只有用类似Brute类才能被实例化
 
Guid(a,b,c,d):
         现阶段没有被使用,在以后支持COM时将会被添加到虚幻中
Transient:
         表明这个类的不必保存到磁盘,也就是说这种类并不是永久使用的,而是暂时的。类似的有Players,Windows
Config(section_name):
         一些有必要保存的变量,全局变量。一个类就是一个ini文件
 
虚幻脚本的name类型可以是函数,状态或者类等等的预定义名称,它和字符串的区别就在于:字符串可以动态修改,而name一次确定,不再修改
变量修饰符:
Input:可以被虚幻输入系统识别的变量,类似于将键盘或者手柄的输入映射于某个变量
 
Native:
         从C++装载或者保存的类型
 
虚幻只支持1维数组,多维数组请自行实现
 
函数修饰符
Static:
         与C++不同的是:虚幻脚本静态函数只能访问静态函数,一些变量的默认值,不能调用非静态,实例化了的函数。并且不能被重载
 
Singular:
         一种防止函数被递归调用的修饰。当你写一个Actor碰撞另外一个Actor的逻辑时,函数递归调用将会导致栈溢出。添加这个修饰符后,已经被调用的函数就不会被重复调用。
 
Latent:
         延时函数:在状态中调用一个延时函数,在过一定的tick后,该函数才会被返回
 
Iterator:
         定义一个函数为迭代器,用于使用foreach遍历一个actor list
 
Simulated:
         当一个actor是模拟代理(simulated proxy)或者独立代理(autonomous proxy)时决定一个函数在客户端运行
 
Operator:
         与C++类似
 
Event:
         只是一个编译器修饰,在使用unreal -make –h可以将脚本事件函数与C++连接代码对应起来。
 
脚本中的
event Touch( Actor Other )
{ ... }
 
在被列出源码为
void Touch(class AActor* Other)
{
    FName N("Touch",FNAME_Intrinsic);
    struct {class AActor* Other; } Parms;
    Parms.Other=Other;
    ProcessEvent(N,&Parms);
}
 
 
状态
虚幻脚本是唯一一个于语言层支持状态的语言
使用状态的好处:
         可以很方便的书写基于状态的函数(逻辑),一些函数和逻辑就可以被不同的状态共享,而其执行结果只是决定于actor实际在做什么。
         状态中可以使用延时函数,这是一种特殊类型的函数,C++和java都没有实现。例如:你可以实现以下逻辑:打开一个门,等待2秒后播放音效然后再打开另外一道门,释放一些怪,让它们打玩家,你可以以非常普通常见,线性的逻辑来书写这些代码。而具体的细节将有虚幻底层来实现
 
 
 
 
3种主要的延时函数
Sleep:
         暂停脚本执行一段时间,后继续执行
 
FinishAnim
         等待当前播放的动画完毕后继续执行。使用这个函数可以很方便的书写动画驱动的逻辑,AI逻辑就是严格的的动画驱动(有别于时间驱动),平滑的动画控制是一个AI系统的关键
 
FinishInterpolation
         等待当前茶致电动作完成后继续
 
 
状态的流程控制:
         使用Goto语句在不同的代码段间切换
 
auto state MyState
{
Begin:
     Log( "MyState has just begun!" );
     Sleep( 2.0 );
     Log( "MyState has finished sleeping" );
     goto Begin;
}
 
使用GotoState转入执行某个状态
 
 
实例
// This is the automatic state to execute.
auto state Idle
{
     // When touched by another actor…
     function Touch( actor Other )
     {
              log( "I was touched, so I’m going to Attacking" );
              GotoState( ‘Attacking’ );
              Log( "I have gone to the Attacking state" );
     }
Begin:
     log( "I am idle…" );
     sleep( 10 );
     goto ‘Begin’;
}
 
// Attacking state.
state Attacking
{
Begin:
     Log( "I am executing the attacking state code" );
     //...
}
 
运行结果
I am idle...
I am idle...
I am idle...
I was touched, so I’m going to Attacking
I have gone to the Attacking state
I am executing the attacking state code
 
 
 
状态继承和可视规则
 
// 父类
class MyParentClass expands Actor;
 
// 非状态函数
function MyInstanceFunction()
{
         log( "Executing MyInstanceFunction" );
}
 
// A 状态
state MyState
{
         // A 状态函数
         function MyStateFunction()
         {
                   Log( "Executing MyStateFunction" );
         }
// Begin标签
Begin:
         Log("Beginning MyState");
}
 
// 子类实现
class MyChildClass expands MyParentClass;
 
// 重载非状态函数
function MyInstanceFunction()
{
         Log( "Executing MyInstanceFunction in child class" );
}
 
// 重定义状态,并且重载函数
state MyState
{
         // 被重载的函数
         function MyStateFunction()
         {
                   Log( "Executing MyStateFunction" );
         }
// 标签被重载
Begin:
         Log( "Beginning MyState in MyChildClass" );
}
 
 
规则:
1.       如果对象是一个状态,无论被定义过多少次,最后重载的那个类将会被执行
2.       否则,按照重载次数,并且是非状态版本的函数被执行
 
状态可以同样使用expand来继承状态
// Base Attacking state.
state Attacking
{
        
}
 
// 上段攻击
state MeleeAttacking expands Attacking
{
        
}
 
//远距离攻击.
state RangeAttacking expands Attacking
{
        
}
 
 
使用ignores指定忽略的函数
state Retreating
{
         // 忽略以下函数的调用
         ignores Touch, UnTouch, MyFunction;
 
}
 
 
默认属性:
         默认属性可以在物体在编辑器或者创建的时候给出一些列的预设值。这是一种很好的可重入性表现和代码规范的标准
 
 
 
技术细节:
         虚幻的垃圾回收采用与JAVA 虚拟机类似的树跟随方式(tree-following),回收器使用Uobject的序列化功能递归的获取到哪些物体引用了其他的对象
 
         虚幻脚本是基于bytecode的,编译时,脚本将类似于java一样被编译为虚拟机代码。这使得其可以做到方便的跨平台
 
         虚幻脚本是2次pass,第一遍pass确定变量,状态和函数定义,第二遍编译为p-code。这种机制使得复杂的循环依靠的逻辑继承结构可以完整的编译并且链接
        
         可恢复的玩家状态:虚幻可以在游戏进行的任何时刻保存所有actor的状态和运行情况到磁盘,并在必要时恢复。因为其状态和函数执行只是运行于低端的虚拟机,运行结果只是依赖于栈数据,所以,保存栈数据是非常关键的
 
虚幻文件包:这是一种包含索引,序列化dump和对象细节的二进制格式包。其很类似于DLL,可以拥有一个引用其他包的列表。这样可以很方便的将预定义包放在Internet提供下载,已经下载的包将不会在下载以减少下载次数(manifest机制)
 
 
 
开发策略
C++脚本大约每秒能执行5千万条指令,虚幻脚本能执行250万条指令,相差20倍,整个游戏中,脚本执行需要花费CPU 5~10%的时间。使用虚幻脚本做一些你实际感兴趣的时间,或者需要自定义的部分。而不是将一些基础移动的代码重新书写一遍,物理系统可以为你做一切。
 
大量使用延时函数,如果依然按照时间驱动的传统方式书写这类逻辑将是低效的
 
代码书写中减少无限递归的出现:在Move命令执行中,actor将发生碰撞,然后调用Bump函数,如果在Bump中依然有Move指令将形成无限递归。无限递归和死循环是虚幻脚本不能很好解决的地方(所有语言都是-_-! Tim太谦虚)
 
创建和销毁actor将是服务器端一个非常耗费资源的操作,特别是在网络游戏中,销毁和销毁中需要发包,占用一定的网络带宽。
 
尽量使用面向对象特性。在写新功能时尽可能的重载已有函数和状态让代码清爽,方便修改,便于和其他人的成果集成。避免使用传统的C技巧,类似于使用switch判断actor的状态并执行不同的操作。这样的操作阻止你加入新的类和修改一些东西。
 
 
2012-06-10 22:29:30 Garuda 阅读数 3676
  • 从这里开始虚幻4-第2辑-蓝图 v4.18

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

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

看了unreal engine4的ElementalTech DemoFeaturesand Development Walkthrough两个视频,效果还是非常赞的。看来epic这几年是下了大力气了。

下面说说ue4的重要特性吧

1.     延迟渲染

Ue4完全抛弃了预计算技术,取而代之的是全实时的延迟渲染。这个应该是ue4在渲染上最大的改变。随之而来的将会是ue4比ue3对硬件的要求会有大幅的提高。(硬件厂商又高兴了)

2.    实时GI。

当年CryTech的LPV一出来立刻就成为了业内的热门话题。这回epic终于也搞了个real-time GI出来,而且更进了一步。这个所谓的SVOGI – Sparse Voxel Octree Global Illumination相比LPV最明显的优势是精度更高,能够实现high-frequency的间接光照。关于这项技术更详细的信息可以参考nvidia的paper


地面的高光反射出塑像的颜色


Ue4间接光照

3.    软粒子的光照


软粒子接受直接和间接光照


软粒子投射阴影

4.    GPU粒子

GPU粒子虽然不是特别特别新鲜的技术,但是集成到游戏引擎中我还是第一次见到。特别是ue4的实现中,通过向量场与GPU粒子交互的效果还是蛮酷的。


Ue4 GPU粒子

5.    高度可破坏的场景

这是APEX的主打技术。


可破坏的场景

6.    全新的Kismet

据说unreal engine4完全移除了动态脚本(出于效率的原因?),取而代之的是纯C++脚本系统,并且完全是实时编译,热更新。


Ue4新的可视化编程系统


实时编译和热更新

 

总之,unreal engine4还是让人眼前一亮的。期待尽快能有用ue4开发的游戏上市,到时候我就换块GTX680

1.c++调用uc脚本中的函数

博文 来自: qweewqpkn
没有更多推荐了,返回首页