unreal_unrealcop@gmail - CSDN
unreal 订阅
Unreal是UNREAL ENGINE(虚幻引擎)的简写,由Epic开发,是世界知名授权最广的游戏引擎之一,占有全球商用游戏引擎80%的市场份额。虚幻技术研究中心在上海成立,该中心由GA国际游戏教育与虚幻引擎开发商EPIC的中国子公司EPIC GAMES CHINA联合设立。 展开全文
Unreal是UNREAL ENGINE(虚幻引擎)的简写,由Epic开发,是世界知名授权最广的游戏引擎之一,占有全球商用游戏引擎80%的市场份额。虚幻技术研究中心在上海成立,该中心由GA国际游戏教育与虚幻引擎开发商EPIC的中国子公司EPIC GAMES CHINA联合设立。
信息
原版名称
unreal
开发商
Epic
发行商
EPIC GAMES CHINA
中文名
虚幻
Unreal技术
“Unreal Engine 3”3D引擎采用了最新的即时光迹追踪、HDR光照技术、虚拟位移…等新技术,而且能够每秒钟实时运算两亿个多边形运算,效能是“Unreal Engine”的100倍,而通过NVIDIA的GeForce 6800显示卡与“Unreal Engine 3”3D引擎的搭配,可以实时运算出电影CG等级的画面,效能非常非常恐怖。
收起全文
精华内容
参与话题
  • Unreal Engine 4 初学者教程:开始

    万次阅读 多人点赞 2018-06-14 16:11:14
    Unreal Engine 4 初学者教程:开始 原文:Unreal Engine 4 Tutorial for Beginners: Getting Started 作者:Tommy Tran 译者:kmyhy Unreal Engine 4 是一个游戏开发工具集,能够开发从 2D 手机游戏到 3A ...

    原文:Unreal Engine 4 Tutorial for Beginners: Getting Started
    作者:Tommy Tran
    译者:kmyhy

    Unreal Engine 4 是一个游戏开发工具集,能够开发从 2D 手机游戏到 3A 级主机游戏的一切。“方舟:生存进化”、“泰克肯7”和“王国之心 III”这些游戏背后使用的引擎就是它。

    对于初学者来首,用 Unreal Engine 4 开发是很简单的。通过蓝图可视化脚本系统,你可以不写一行代码就创建出整个游戏。再加上一个易于使用的界面,你就可以获得一个可以运行的游戏原型。

    本教程主要是让初学者入门。它涉及以下几个知识点:

    • 安装引擎
    • 导入资源
    • 创建材质
    • 用蓝图(Blueprint)创建具有基本功能的对象

    为了学习这些知识,你会创建一个用于展示一只香蕉的旋转转盘。

    注:本教程属于 Unreal Engine 教程系列,这个系列共 10 个部分:

    安装 Unreal Engin 4

    Unreal Engine 4 使用 Epic Games Launcher 进行安装。进入 Unreal Engine 网站 并点击 Get Unreal 按钮(右上角)。

    下载这个安装器需要创建一个账号。创建账号之后,选择下载和你的操作系统对应的版本。

    下载并安装完安装器之后,运行安装器。会显示一个窗口:

    输入 email 和密码,点击 sign in。登录之后会显示这个窗口:

    在左上角,点击 Install Engine,安装器会让你选择要安装的组件:

    注:Epic Games 经常升级 Unreal Engine,因此你的引擎版本会与此不同。例如我写第一稿时,版本已经升级到 4.14.3! 只要你的版本不低于 4.14, 你就可以使用本教程。

    默认选中的是 Starter Content、Templates and Feature Packs 和 Engine Source。就保持这样的选择不变。它们分别是:

    • Starter Content: 这是你可以在自己项目中免费使用的资源集。它包含了一些模型和材质。你可以在你的游戏中临时使用它们。
    • Templates and Feature Packs: 模板可以根据你的选择来创建基本功能。例如,Side Scroller 模板会创建一个项目,项目中包含一个角色、基本动作和一个固定的水平相机。
    • Engine Source: Epic 提供了源码,这样任何人都可以修改这个引擎。例如,如果你想为编辑器添加自定义功能,你可以通过修改源码来实现。

    拖动这个列表,还有几种不同的平台。如果你不打算支持某个平台,请让它反选。

    选好组件之后,点击 Install。安装完成后,引擎会在 library 中显示。接下来我们创建项目。

    创建项目

    点击 Launch 按钮打开项目浏览器。在项目浏览器中,点击 New Project 标签页。

    点击 Blueprint 标签页。这里,你可以选择一个模板。但是,因为我们想从空白开始,所以选择了 Blank template。

    在下面,你会发现有更多的设置。

    分别有这几个选项:

    • Target Hardware: 选择 Mobile/Tablet 会关闭一些后期处理效果。还会用鼠标模拟触摸。设置为 Desktop/Console。
    • Graphical Target: 选择 Scalable 3D or 2D 会关闭一些后期处理特效。请设置为 Maximum Quality。
    • Starter Content: 使用这个选项可以包含一些开始内容。为了简单起见,这里将它设为 No Starter Content。

    最后一部分设置是指定项目文件夹地址和项目名称。

    点击 Folder 栏右边的 3 个小点,可以改变项目文件夹地址。

    项目名称不代表游戏名称,因此不用担心后期可以修改这个名称。选择 Name 栏的文本框,输入 BananaTurntable。

    最后,点击 Create Project.

    认识界面

    创建完项目,编辑器会打开。编辑器分成了几个区域:

    1. 内容浏览器: 这里显示所有项目文件。用它创建文件夹并组织文件。可以在搜索栏中查找文件或者过滤文件。
    2. Modes: 这里可以选用各种工具比如 Landscape 工具和 Foliage 工具。默认工具是 Place 工具。它允许将各种对象比如灯光和相机放到游戏关卡中。
    3. 世界大纲编辑器: 显示当前关卡中的所有对象。你可以通过将相关的对象放入文件夹中来组织整个列表。它也可以搜索或者通过类型来过滤。
    4. 详情: 你选中的对象会在这里显示出属性。这里可以编辑对象的设置。这里进行的修改只会影响这个对象的实例。例如,如果你有两个球体,如果你改变了其中一个的大小,那么只会对你选中的对象有效。
    5. 工具栏: 包含各种功能。你用得最多的一个就是 Play。
    6. 视口: 关卡视图。按下右键拖动鼠标可以查看四周。按下右键,用 WASD 键进行移动。

    导入 Assets

    光有一个圆桌却没有要陈列的东西有什么用?请下载香蕉模型。里面有两个文件 Banana_Model.fbx 和 Banana_Texture.jpg。当然,你可以用自己的模型。但你怎么来使用这个该死的香蕉呢?

    在 Unreal 能够使用一个文件之前,你必须导入它。在内容浏览器,点击 Import。

    通过文件浏览器,找到 Banana_Model.fbx 和 Banana_Texture.jpg。框选住两个文件,然后点击 Open。

    对于 .fbx 文件,Unreal 会提供几个导入选项。确保 Import Materials 未选中,因为你会创建自己的材质。其它设置保持不变。

    点击 Import。这两个文件就显示到内容浏览器中了。

    在导入文件时,实际上它是不会保存到项目中的,除非你明确地这样做。你可以用右键点击这个文件,选择 Save 就可以保存它们了。还可以选择 File\Save All 来一次性保存所有文件。确保经常使用保存功能。

    注意在 Unreal 中模型被称为网格。选择你已经有一个香蕉的网格了,可以将它放到关卡中了。

    添加网格到关卡

    选择关卡看起来空空的,让我们放点东西。
    要添加网格,左键将 Banana_Model 从内容浏览器中拖到视口。放开鼠标左键,就可以将网格放下。

    关卡中的对象是可以移动、旋转和缩放的。它们的快捷键分别是 W、E 和 R。然后使用操纵杆:

    材质

    如果你近距离查看香蕉,你会发现它根本不是黄的。事实上,它是灰色的。要给香蕉一些颜色和细节,你必须创建材质。

    材质是什么?

    材质决定了某件东西的表面外观。在一个基本的关卡中,材质定义了 4 个方面:

    • 基本色: 一个表面的颜色或纹理。常用于添加细节和色彩的变化。
    • 金属化:表面和金属的相似度。通常,纯粹的金属拥有的金属化值是最大的,而织物的金属化值为 0。
    • 高光:控制非金属表面的发光。例如,陶瓷拥有较高的高光值,而黏土则相反。
    • 粗糙度:粗糙度最大时,没有任何高光。用于岩石或木头的表面。

    下面是 3 种材质的例子。它们颜色相同但属性不同。每种材质都有在对应的属性上设置为较高值。另外的属性则设为 0。

    创建材质

    要创建材质,请进入内容浏览器,点击绿色的 Add New 按钮。会弹出一个菜单显示你可以创建的 assets。点击 Material。

    将材质取名为 Banana_Material 然后双击文件打开材质编辑器。

    材质编辑器

    材质编辑器由 5 部分组成:

    1. 图(graph): 这个区域包含所有节点和结果节点。按下鼠标右键并移动鼠标可以平移。滚动鼠标滚轮可以进行缩放。
    2. 详情: 这里显示选中节点的属性。如果没有选择任何节点,这里会显示材质的属性。
    3. 视口: 包含一个预览的网格,显示你的材质。要转动相机可以按住鼠标左键并移动鼠标。要缩放可以用鼠标滚轮。
    4. 调色板:一个列表,列出材质所有节点变量。

    什么是节点?

    在开始编辑材质前,你必须知道节点是什么。

    节点构成了材质的主体。有许多不同的节点,提供了不同的功能。

    节点可以有输入和输出,用一个圆圈+一个箭头来表示。输入位于左边,输出位于右边。

    材质有一个特殊的节点,就是结果节点,在 Banana_Material 中它是现成的。它是所有节点的终点。一旦你接通这个节点,就可以决定材质的最终显示。

    添加材质

    要为一个模型添加颜色和细节,你需要一个纹理。一个纹理就是一张 2D 图片。通常,它们会投射到 3D 模型上,让它具有颜色和细节。

    为了给香蕉贴图,你需要使用到 Banana_Texture.jpg。TextureSample 节点允许你在材质上使用贴图。

    找到调色板,找到 TextureSample。按下鼠标左键,将它拖到“graph”窗口。

    要选择纹理,首先需要选中这个 TextureSample 节点。找到详情面板,点击 Texture 右边的下拉按钮。

    列表中列出项目中所有纹理。选择 Banana_Texture.

    要在预览网格上查看贴图,需要将它插进结果节点中。左键点击 TextureSample 节点的白色输出按钮上,将它拖到结果节点的 Base Color 输入按钮上。

    回到视口,在预览网格上查看纹理。旋转它(按下鼠标左键并拖动)查看其它细节。

    点击工具栏上的 Apply 按钮,应用你的材质。然后关闭材质编辑器——这部分的工作结束了。

    使用材质

    要将材质应用到香蕉上,你需要指定它。回到内容浏览器,双击 Banana_Model 打开它。这会显示一个编辑器:

    找到详情面板 Materials 一节。点击 Element 0 右边的下拉按钮,选择Banana_Material.

    关闭网格编辑器,回到主编辑器,看一下视口。你将看到香蕉现在已经贴图了。恭喜,你已经成为了一个关卡设计师了!

    注:如果光线太暗,你可以在世界大纲编辑器中点击 Light Source 来改变它。在详情面板中,找到 Intensity,设置为更高的值。

    蓝图

    香蕉看起来很好,但如果将它放到圆桌上旋转就更好了。用蓝图来创建一个圆桌很轻松。

    简单讲,一个蓝图(Blueprint)表示一件”东西“。蓝图允许你为对象创建自定义行为。对象可以是某种物体(比如圆桌),也可以是某些抽象的东西比如生命系统。

    想制作一辆会动的车吗?构建一个蓝图。一只会飞的猪呢?使用蓝图。一只在碰撞中爆炸的小猫?还是蓝图。

    就像材质一样,蓝图使用了节点系统。这意味着你只需要创建节点然后将它们连接起来,不需要编写代码!

    注:如果你更喜欢写代码,你可以用 C++。蓝图易于使用,但它们无法做到和 c++ 代码一样快。如果你不得不用到大量计算的东西,比如复杂算法,你应当使用 c++。
    当然虽然你喜欢 c++,但很多时候用蓝图其实是个好主意。蓝图有这些优点:

    • 通常,蓝图比 c++ 的开发速度更快。
    • 易于组织。你可以将节点分成不同的模块,比如功能和图形。
    • 如果你和非编程人员一起工作,修改蓝图更容易,因为它的可视化和直观性。

    将对象用蓝图来创建是一种好办法。当需要提升性能时,将它们转换成 c++。

    创建蓝图

    在内容浏览器,点击 Add New。在列表中选择 Blueprint Class。

    弹出一个窗口,让你选择父类。你的蓝图会从父类继承所有的变量、函数和组件。花点时间了解每个类能做什么。

    注:Pawn 和 Character 也是 Actor 类,因为你可以放置和生成它们。

    因为圆桌只会待在一个地方不动,Actor 类最适合。选择 Actor 然后给文件命名为 Banana_Blueprint。

    最后,双击 Banana_Blueprint 打开它。当窗口弹出时,点击 Open Full Blueprint Editor :

    蓝图编辑器

    首先,在蓝图编辑器中,选择 Event Graph 标签页。

    蓝图编辑器有 5 个主要的窗口:

    1. 组件窗口:当前组件的列表。
    2. 我的蓝图:用于管理你的图形、功能和变量。
    3. 详情窗口:显示当前选中对象的属性。
    4. 图形窗口:这是关键。所有节点和逻辑都在这里。按下右键并拖动鼠标进行平移。滚动鼠标滚轮进行缩放。
    5. 视口:任何拥有可视化元素的组件都在这里显示。你可以用主编辑器一样的方式移动和旋转。

    创建圆桌

    要创建圆桌,需要两个东西:一个基座和一个陈列品。你可以通过组件来创建这两个东西。

    什么是组件?

    如果一个蓝图是一辆车,那么组件就是组成车辆的构件。例如,车门、轮胎、引擎都是组件。

    但是,组件不仅仅限于物理对象。

    例如,要让车动起来,你需要添加一个移动组件,你甚至可以为它添加一个飞行组件让它飞起来。

    添加组件

    在你看到任何组件之前,你需要切换到视口视图。点击 Viewport 标签页即可切换到它。它看起来像这个样子:

    注:DefaultSceneRoot 组件在玩游戏时不会显示。它只在编辑器中显示。

    这个圆桌用到了两个组件:

    • Cylinder: 一个简单的白色圆柱体。这是放置香蕉的底座。
    • Static Mesh: 这个组件用于显示香蕉网格。

    要添加底座,找到组件面板。点击 Add Component 并选择 Cylindar。

    最好让底座变得更短一点。按下 R 键,显示缩放操作杆,然后将它缩短(不要管真实大小,你可以在后面修改它)。

    然后来添加网格。回到组件面板,在空白地方点击左键,清除对圆柱体的选中状态。这能保证接下来的组件不会附加在圆柱体组件上。

    注:如果不这样做,接下来的组件会附加在圆柱体上。这意味着它会继承圆柱体的 scale 属性。因为你缩短了圆柱体,那么接下来的组件也会被缩短。

    然后。点击 Add Component,选择 Static Mesh。

    要显示香蕉,选择这个静态网格组件,然后点击 Details 标签页。点击 Static Mesh 右边的下拉按钮,选择 Banana_Model。

    如果它的位置不对,请移动香蕉。按 W 激活操作杆,移动它的位置。

    蓝图节点

    接下来让圆桌旋转。这就要用到蓝图节点了。

    和材质节点不同,蓝图节点拥有特殊的 pin 叫做 Execution pin。位于左边的 pin 是输入,位于右边的则是输出。所有节点至少有一个输入/输出。

    如果节点有一个输入 pin,它前边必定有一个连接才能执行。如果有一个节点没连接,那么后续的任何节点都不会执行。

    举一个例子:

    节点 A 和节点 B 会执行,因为他们的输入 pin 已经有连接。节点 C 和节点 D 不会执行,因为节点 C 的输入 pin 是断开的。

    转动圆桌

    在开始之前,看一眼组件面板。你会看到 Cylindar 和 Static Mesh 有缩进而 DefaultSceneRoot 没有缩进。这是因为前者是附加到 DefaultSceneRoot 上的。

    如果你移动、旋转或缩放 root 组件,那么它包含的组件也会有同样动作。通过这种方式,你可以让 Cylinder 和 Static Mesh 一起旋转,而不是分别旋转。

    创建节点

    要开始编写脚本,需要进入 Event Graph 标签页。

    让某个对象旋转非常简单,只需要创建一个节点。在 graph 视图空白地方右键,打开有效的节点菜单。搜索 AddLocalRotation。因为你需要旋转底座和香蕉,你只需要旋转 root 组件即可。选择 AddLocalRotation(DefaultSceneRoot)。

    注:如果没有列出这个节点,请反选菜单右上角的 Context Sensitive 选项。

    在 graph 窗口中会多出一个 AddLocalRotation 节点。Target 输入会自动连接到你选择的组件。

    要设置旋转角度,找到 Delta Rotation 输入,然后修改 Z 值为 1.0。这将导致蓝图沿 Z 轴旋转。值越大,转速越快。

    要不断地旋转,你必须逐帧调用 AddLocalRotation。要逐帧调用,需要使用 Event Tick 节点。它已经在你的 graph 视图中了。如果没有,用前面一样的方法创建一个。

    将 Event Tick 节点的输出 pin 拖到 AddLocalRotation 节点的输入 pin。

    注:用这种方法,旋转速度取决于帧率。这意味着机器越慢圆桌的转速越慢,反之亦然。这对于本教程来说是可以的,因为我让事情简单化了,但在后面的教程中我会介绍如何解决这个问题。

    最后,点击工具栏上的 Compile 按钮,更新你的蓝图,然后关闭蓝图编辑器。

    将蓝图添加到关卡

    在添加蓝图之前,在主编辑器的视口中,删除香蕉的模型。选择该模型,点击 Edit\Delete 菜单或者按 Delete 键。

    添加蓝图和添加网格一样。在文件上按住左键,将它拖到视口中。

    点击工具栏上 的 Play 按钮,看看效果!

    注:如果你没有删除原有的香蕉模型,你可能会被警告”灯光需要重建“。如果删掉模型,则错误不再显示。

    接下来去哪里?

    在这里下载完成后的项目。

    你已经学完这篇教程,但那只是 Unreal 中极小的一部分。如果你想继续学习,请阅读本系列的下一篇教程,我将介绍 Unreal 引擎更多关于蓝图的内容。

    展开全文
  • 史上最全的Unreal Engine 4学习资料整理

    千次阅读 多人点赞 2019-10-01 15:56:02
    官方 官方文档 中文版 http://api.unrealengine.com/CHN/ 英文版 https://docs.unrealengine.com/en-us/ 虚幻学院(英文教程,未来可能有汉化) https://academy.unrealengine.com/ 官方B站 ...【吕鑫】【VS20...

    官方

    官方文档

    虚幻学院(英文教程,未来可能有汉化)

    https://academy.unrealengine.com/

    官方B站

    https://space.bilibili.com/138827797/#/

    C++

    • 【侯捷】《C++系统工程师》课程
    • 【吕鑫】【VS2015】C/C++/数据结构教程(推荐有选择的看)http://class.qq.com/class/22124.html
    • 书籍推荐
      《C++ Primer Plus》或《Essential C++》或《C++ Primer》
      《大话数据结构》或《C++数据结构与算法(目前第4版)》
      《Effective C++》
      《More Effective C++》
      《Effective STL》或《STL源码剖析》
      《设计模式》、《游戏编程模式》
      《C++沉思录》
      《深度探索C++对象模型》

    UE4教程

    基础操作

    蓝图编程基础

    蓝图编程简介

    蓝图的类型 注:此处的种类只说直接实现游戏逻辑的蓝图,动画蓝图等暂不谈

    变量类型

    UE4的组件

    【官方文档】

    【猎梦虚幻研究社】

    事件节点

    事件调度器(事件分配器)

    【官方文档】事件调度器的使用

    事件分配器

    • 【官方文档】 UE4的蓝图编程中,所有游戏逻辑的函数都需要通过事件来驱动,而自定义事件可以当做函数来驱动,同时也可以通过事件调度器进行驱动,通过事件调度器,可以让蓝图实现的游戏逻辑更加灵活

    流程控制

    蓝图的函数

    枚举类型

    蓝图的数组

    【官方文档】

    【大神博客】

    蓝图的结构体

    【官方文档】

    【大神博客】 结构体的使用(包含部分关于枚举类型的操作)

    【大神博客】结构体数组及多维数组

    【猎梦虚幻研究社】

    HitResult

    蓝图的容器

    Map

    【官方文档】

    Set

    【官方文档】

    蓝图宏

    【官方文档】

    【大神博客】

    Timeline(时间轴)

    随机流

    数学表达式

    蓝图的面向对象

    构建脚本(蓝图相对于C++的构造函数)

    面向对象特性

    继承
    多态
    • 重写父类函数:在MyBlueprint栏的Function组上方,有一个Override菜单,下拉并选择要重写的函数,派生类中重写的函数会覆盖基类的函数
    • 调用重写后的父类函数:右键重写后的函数节点,选择“Add call to parent function”选项
    抽象
    • 如果了解面向对象思想中的抽象概念,自主按照需求定制蓝图类即可
    封装
    • 蓝图类中的变量的细节面板中的“Instance Editable”如果打对号(或者MyBlueprint栏中让变量对应的眼睛睁开,即暴露蓝图变量),则当蓝图在关卡中被实例化后,可以通过实例的细节面板进行修改相应变量的值
    • 蓝图类中的变量和函数在细节面板中都有Private选项,如果Private打钩,则该变量或函数无法被蓝图类的派生类继承

    蓝图通信 注:蓝图通信可以理解为不同蓝图间的信息传递和共享

    【官方文档】 蓝图通信方法(没有提GetAllActorOfClass)

    【大神博客】 https://www.cnblogs.com/songiveideas/p/learnmore2.html

    1、直接蓝图

    2、事件调度器

    • 参考上方“事件节点”

    3、蓝图投射(CastTo节点)

    4、蓝图接口

    实现蓝图接口 http://api.unrealengine.com/CHN/Engine/Blueprints/UserGuide/Types/Interface/UsingInterfaces/index.html
    使用蓝图接口 http://api.unrealengine.com/CHN/Engine/Blueprints/BP_HowTo/Interfaces/index.html
    蓝图接口迁移 http://api.unrealengine.com/CHN/Engine/Blueprints/UserGuide/BlueprintComms/InterfaceMigration/index.html

    5、GetAllActorOfClass

    • 这种方式并不能算是严格意义上的蓝图通信,其作用是通过该节点直接操作某一个类在关卡中所有的实例对象

    视频教程

    B站

    人人素材

    ABOUTCG在线课堂

    SiKi学院

    我的联系方式:

    QQ:2161044579
    邮箱:mogoostudio@outlook.com
    Github:https://github.com/MogooStudio

    展开全文
  • 虚幻4开发入门

    万人学习 2018-10-22 21:38:03
    UnrealEngine向来以一流效果和难以上手而著称,本课程就是帮助你跨过入门的这道门槛,能够上手掌握这个国际一流的3D引擎。
  • unreal 的初步认识

    千次阅读 2017-08-17 13:07:54
    游戏结构先说怎么多 ,我们来玩玩引擎把,先来来说一说一个普通虚幻游戏的框架吧(好对照着引擎说) 上图是我在ununreal 官网抓下来的。现在我们来梳理一遍。可以看见 一个游戏(Game)的核心是游戏模式(Game...

    游戏结构

    我们来玩玩引擎吧,先来来说一说一个普通虚幻游戏的框架吧(好对照着引擎说)
    这里写图片描述
    上图是我在ununreal 官网抓下来的。现在我们来梳理一遍。可以看见 一个游戏(Game)的核心是游戏模式(GameMode)和游戏状态(GameState)。他们决定了游戏怎么玩(准确说怎么结束)。之后我们看见他把一个玩家控制器(PlayController) 加入(join)进去了,而这个控制器他控制(possess)着Pawn(不知道怎么翻译,暂且认为旗子吧)。而这个Pawn也可能是有AI控制器控制着(AIController)。再来看看玩家控制器中还有一个包含(Contains)这玩家界面(HUD),输入(input),玩家相机管理器(PlayerCameraManger)。

    引擎的初步认识

    这里写图片描述
    Viewport
    上图红色区域叫做Viewport,他实时显示着我们的游戏世界,一下是操作,请自己试试

    • 鼠标左,右键的拖拽和两个键一起拖拽
    • 像上面那样按住鼠标按键之后我们可以按q,w,e,a,s,d,z,,c建
    • alt 建+鼠标左,右键拖拽
    • 鼠标左键选择好ViewPort中的物体之后按F键会把窗口聚焦到该物体上。

    World Outliner
    绿色的World Outliner ,显示这我们游戏世界(Viewport)中所有的东西,无论是看得见还是看不见。

    Content Browser
    黄色区域Content Browser对应这游戏工程在硬盘中的Content文件夹下的文件结构。file->open project->右键某个工程->show in explorer

    modes
    蓝色modes 窗口,是一些预设的东西,你可以把想要的东西拖拽到ViewPort中,这样World outliner中也会出现该东西。

    Details
    其实右下角还有一个窗口 Details ,当你在在world outliner 或者Viewport中选择了相应的东西之后,Details 就会显示该物件的详细信息,因为我们没有选择任何东西,所以上图时空的。

    tips:
    如果你不小心把上面的窗口给关闭了,可以在左上角菜单栏window中找到所有窗口

    我们都知道unreal engine 是用c++最为开发语言的,而c++虽然很强大,但是因为c++编译语言的特性导致一些开发效率上的问题。所以epic 在开发unreal 的时候给他开发了很多有用的工具可以解放很多生产力。而这些工具放心使用的前提是你要遵守unreal 代码的书写规范。我会在以后陆续归纳其中的规则。

    类命名前缀

    虚幻引擎为您提供在构建过程中生成代码的工具。这些工具的使用必须遵循一些类命名规则。如命名与规则不符,将触发警告或错误。下方的类前缀列表说明了命名的规则。

    派生自 Actor 的类前缀为 A,如 AController。
    派生自 对象 的类前缀为 U,如 UComponent。
    枚举 的前缀为 E,如 EFortificationType。
    接口 类的前缀通常为 I,如 IAbilitySystemInterface。
    模板 类的前缀为 T,如 TArray。
    派生自 SWidget(Slate UI)的类前缀为 S,如 SButton。
    其余类的前缀均为 字母 F ,如 FVector。(为什么以F开头 官方给了链接

    UObject和AActor

    UObject和AActorn的是c++类名,名字遵循之前讲的类命名前缀
    UObject很像java 中的Object类,是Unreal engine 中绝大数类的父类,然而UObject类还不是根类,他”上面“还有 UObjectBaseUtility, UObjectBaseUtility”上面“还有UObjectBase。但是相对于UObjcet的父类来说,UObject是Unreal engine 最小的 ”单位“了,就像细胞内部其实还有东西,但是相对于人体来说我们可以把细胞看成最小的单位。这样你说你可能还是觉得有点抽象,那么我们来看看作为最为最小”单位“UObject能完成什么工作吧。(官方给的)

    • 垃圾回收
    • 引用更新
    • 映象
    • 序列化
    • 默认属性变化自动更新
    • 自动属性初始化
    • 自动编辑器整合
    • 运行时类型信息可用
    • 网络复制

    你可能不知道上面各项具体意思,没关系我也不知道。但是我们可以知道,官方认为上面的功能是Unreal engine 中每一个“东西”都可以有,但是不一定有的,所以就把这些功能写在了UObject类中了。

    现在来看看AActor。字面意思“演员”,但是不要被它迷惑,其实它是能被放入游戏世界场景的所有游戏性对象的基础类(不论能不能看见)。其实官方给了一个更好的解释,“AActor是一堆UActorComponent的容器” 现在你可能不知道什么是UActorComponent,没关系以后你自然会知道。还有一点很重要AActor继承自UObject,所以一个AActor也是一个UObject。

    知道这些之后我们就可以在来玩一玩unreal了。下面其实是一个官方案例,我觉得很不错就拿他来说一说了(其实就是懒)

    首先我们要新建一个AActor,
    在content Browser 中-> Add New->New C++ Class
    这里写图片描述
    然后你会看见Actor,注意不是AActor,为什么会这样呢,因为unreal 在设计时就定了一个小目标,那就是无论你是不是程序员都可以来开发游戏,
    所以写程序的人和设计游戏的人工作环境时相互独立的(visual studio 和unreal engine),程序员在visual studio 写的代码必须遵循之前所说的类命名前缀,之后官方开发的”小“工具就会把这些类的名字前缀在unreal engine中给屏蔽掉,所以设计人员在unreal engine 中看见的都是没有类命名前缀的代码。事实上官方为了设计分离还做了一个叫做blueprint的东西,
    好了回到之前的话题,选择它在选择Next,之后就是起名,我就起一个”FloatingActor“,路径就不要碰了(除非用文件夹分类)。不然会出现意想不到的错误(比如 ,必须在Source目录下才能存储我们创建的类)。然后 Create Class。之后会出现自动启动Visual studio 。
    tips:
    如果你 因为不可抗逆原因打不开的话,你可以unreal工程文件夹下,有一个以你工程名命名.sln结尾的文件,用visual studio 点开它 然后在Games-> Source->工程名 ,也会出现你AActor

    这里写图片描述

    Hot Reloading

    现在来说一说Hot Reloading 。这是个什么东西呢。我们都知道c++是一个需要编译的语言,解决方案分为两个你部分一个Engine,一个Game。Engine就是我们的unreal engine的本体了,也就是我们之前的操作界面,当我们编译运行上面代码时,会把unreal 引擎和我们的游戏代码一起编译运行(不信你可以试试)那么问题就来了,如果每一次我们修改代码都要编译一次。我的天,那么每一次都要关掉之前的界面,在打开编译的界面。于是hot reloading技术就诞生了。在unreal界面仍在运行时直接以普通方式从 Visual Studio 或 Xcode 进行编译。unreal 界面将检测到新编译的 DLL 文件是否修改并即时重载变更!当我们修改完代码我们可以
    这里写图片描述
    然后就出现
    这里写图片描述
    这样我们的unreal 就会自动更新我们编译之后的代码了
    或者
    这里写图片描述
    也可以完成上面的效果

    回到之前,我们创建完floatingActor 我们就会在unreal 的content browser中看见
    这里写图片描述

    unreal property system (reflection)

    接着我们回到visual studio中,先看我们

    //防止多次include 
    #pragma once
    //AActor定义在一下头文件中,看起来像文件夹结果,其实就是
    #include "GameFramework/Actor.h"
    //很重要单独说
    #include "FloatingActor.generated.h"
    //很重要单独说
    UCLASS()
    class STUDY_API AFloatingActor : public AActor
    {
    //很重要单独说
        GENERATED_BODY()
    
    public: 
        // Sets default values for this actor's properties
        AFloatingActor();
    
    protected:
        // Called when the game starts or when spawned
        virtual void BeginPlay() override;
    
    public: 
        // Called every frame
        virtual void Tick(float DeltaTime) override;
    
    
    
    };
    

    学习过c++的人看见这个类,有一种似曾相识的感觉。但是又有一点不一样,因为这是编辑器给我自动生产的代码。很多代码的运转,都有底层的一些”小“工具(程序)来协同运转。而上面有很多代码都是写给这些“小”工具看的。下面我们一一道来。#include "FloatingActor.generated.h"这句预编译语句非常重要。想要解释我们必须知道一个叫做 unreal property system 又叫reflection,这个套系统为程序赋予运行时进行自我检查的能力。很像java 中的反射机制。翻译成大白话就是当我们的游戏程序跑起来的时候,让unreal知道类中都写了什么。当知道程序中写了什么之后。这写信息就可以被用于诸如 编辑器中的细节面板、序列化、垃圾回收、网络复制、以及蓝图与C++交互等功能。是不是很强大。上面你看见的宏 UCLASS(),GENERATED_BODY(),这些宏标记了需要反射的东信息,当我们编译上述源代码时,UnrealBuildTool工具就会调用UnrealHeaderTool工具,UnrealHeaderTool工具会生成一些代码,~.generated.h,~.generated.cpp就是其生成的代码,其中包含了实现反射的详细代码。在C++定义内部它还包含一个GENERATED_UCLASS_BODY()的宏。GENERATED_UCLASS_BODY() / GENERATED_USTRUCT_BODY()在需要反射的类或者结构体里面是必要的,因为它们会加入额外的函数和typedef到类的内部。这方面的内容有很多我暂时也不懂,不想因为这个打乱学习接着只能不求甚解了,以后遇到会接着说。
    参考:
    https://www.unrealengine.com/blog/unreal-property-system-reflection
    翻译:
    http://www.cnblogs.com/ghl_carmack/p/5698438.html

    BeginPlay(),Tick(float DeltaTime)

    可以看见自动生成的代码覆盖了两个方法,BeginPlay()是一个事件,将告知您 Actor 已以可操作状态进入游戏中。现在便适合开始类的游戏性逻辑。Tick() 每帧调用一次,参数对应的时间量为自上次调用传入的实际运算时间。在此可创建反复逻辑。

    现在我们来看看源代码

    // Fill out your copyright notice in the Description page of Project Settings.
    
    #include "Study.h"
    #include "FloatingActor.h"
    
    
    // Sets default values
    AFloatingActor::AFloatingActor()
    {
        // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
        PrimaryActorTick.bCanEverTick = true;
    
    }
    
    // Called when the game starts or when spawned
    void AFloatingActor::BeginPlay()
    {
        Super::BeginPlay();
    
    }
    
    // Called every frame
    void AFloatingActor::Tick(float DeltaTime)
    {
        Super::Tick(DeltaTime);
    
    }
    

    对于以项目名命名的头文件Study.h大家可以先忽略,如果像了解可以参考下面链接
    参考
    http://www.cnblogs.com/wellbye/p/5837108.html

    这个类只有一个可以说的PrimaryActorTick.bCanEverTick = true;。设置这个参数之后,就会不间断调用Tick函数,如不需要此功能,最好将其移除(设置为false),以节约少量性能开销。如要移除此功能,必须将构建函数中说明 tick 应该发生的代码行删除。

    AActor在世界的表现

    现在我们会到unreal中,把我们创建FloatingActor拖到Viewport中
    这里写图片描述
    可以看见右边的world outliner中已经有我们的Actor,但是你在ViewPort中我们什么也看不见啊。先别急,我之前说过AActor是能被放入游戏世界场景的所有游戏性对象的基础类。但是还有一个更好的解释,**“一堆component的容器”现在就是你理解这句话的意思的最好时候,现在请安下面图片进行操作

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    现在来你应该知道了,AActor派生的类其实就是一个容器,而UComponent派生的类就是真正的功能模块,对于component以后会说,现在有一个了解就可以了。

    现在我们我们回到Visual studio ,在floatingActor.h中加入下代码

    ....
        float RunningTime;
    ....

    在floatingActor.cpp加入下面代码

    ...
    void AFloatingActor::Tick(float DeltaTime)
    {
            Super::Tick(DeltaTime);
    
            FVector NewLocation = GetActorLocation();
            float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime));
            NewLocation.Z += DeltaHeight * 20.0f;      //把高度以20的系数进行缩放
            RunningTime += DeltaTime;
            SetActorLocation(NewLocation);
    
    }
    ...

    然后像上面热重载章节所说的那样选择一种方法 来编译。之后点击ViewPort上面的Play 按钮浏览一下画面

    这里写图片描述

    Tips:
    shift+1或esc来退出

    展开全文
  • 自己进化的Unity人工智能(一)

    万次阅读 多人点赞 2017-11-13 13:51:26
    最近在研究神经网络+遗传算法在Unity给NPC用(一个可以学习训练的NPC是不是很酷) 说一下神经网络真的不复杂,多看一看是能理解的;如果有不对的地方欢迎指出批评。立马修改以免误人; 神经网络定义的东西我就浅表...
    最近在研究神经网络+遗传算法在Unity给NPC用(一个可以学习训练的NPC是不是很酷)
    说一下神经网络真的不复杂,多看一看是能理解的;如果有不对的地方欢迎指出批评。立马修改以免误人;
    神经网络定义的东西我就浅表的谈一谈:
       计算机的人工神经网络简单分为三层:输入层、隐藏层、输出层;
       这三个层的用意用形象的实例描述一下:
          输入层就代表人的感官;
          隐藏层(其实也是多了一层输出变成了下一组的输入)大脑中的神经元;
          输出层用来接收处理后的信息进行分类反应;
       简单的说输入和输出两层连,中间过程执行一个公式:
    [url=][/url]加权
       [url=][/url]进行激活函数(f())
    假设
    输入:一局王者荣耀里
    1、  你看见对面5人调戏大龙:
    2、  其中3人残血;
    3、  自身满血;
    隐藏层:
    1也就是输出层 就是下一层的输入层;
    隐藏层就是再分类再判断比如队友距离、队友血量、队友支援、敌方支援再和上一次的输出进行处理;(一般情况下一层就够了)
    最后输出层:
    1、  如果判断过去: 你将会操作人物移动靠近
    2、  如果判断不过去:你将操作人物离开;
    这么讲应该能理解这三个层的用意把;神经网络这个词我就不解释了 麻烦,想当初我看的时候废话一大堆,然后我并没看明白;
    其实人的行为就是受到神经的刺激而产生的;在我的理解中权重就是这个人的情绪偏向;
    [url=][/url]
    一张图看一下:
       其实人工的神经网络很难真正实现生物神经网络;
    看一下输入层的 图例中输入值为(1、0、1、1);权重就是这个参数影响判断的绝对能力:取决主观意向;
    假设第一层的权重为(0.3、-0.5、0.9、1);
    根据激励函数求出(不加偏移)=0.3+0+0.9+1=2.2D  有人会问 这个2.2D有什么作用;这个是这个激励函数对于输入函数和每个输入函数在神经中的重要性来得出的;在输出函数中需要一个阈值来判断这些值需要执行的动作;可能大于2.2D需要执行一系列动作;
    看图讲什么原理什么都太虚;我直接贴代码讲解代码实现 (毕竟我是一个连复制粘贴都嫌麻烦的人)
    神经网络铺建:
    using System;
    using System.Collections.Generic;
    
    
        public class NeNetwork {
            public double[][][] _NetWeights;
            public int[] _Layers;
            public double[][] _Offset;
            public double[][] _Outputs;
            public NeurFunction[][] Functions;
    
            public NeNetwork(params int[] Layers) {//(5,3)  5输入  3输出
                
                var layersLength = Layers.Length;
                this._Layers = Layers;//各层数量={5,3}
    
                _Outputs = new double[layersLength][];//输出={[5个],[3个]}
               
                for (var i = 0; i < layersLength; i++) {
                    _Outputs[i] = new double[this._Layers[i]];
                }
                 Functions = new NeurFunction[layersLength - 1][];//方法={[5个]}
                _NetWeights = new double[layersLength - 1][][];//权重={[[3个][3个][3个][3个][3个]]}
                _Offset = new double[layersLength - 1][];//偏移={[3个]}
    
                var func = new SiFunction();
                for (var i = 0; i < layersLength - 1; i++) {
                    _NetWeights[i] = new double[this._Layers[i]][];
                    Functions[i] = new NeurFunction[this._Layers[i]];
                    for (var j = 0; j < this._Layers[i]; j++) {
                        _NetWeights[i][j] = new double[this._Layers[i + 1]];
                        Functions[i][j] = func;
                    }
                    _Offset[i] = new double[this._Layers[i + 1]];
                }
            }
    
            public void SetFunction(int layerIndex, NeurFunction func) {
                for (var j = 0; j < _Layers[layerIndex + 1]; j++) {
                    Functions[layerIndex][j] = func;
                }
            }
    
            public double[] GetOut(double[] inputs) {
                
                for (var i = 0; i < _Layers[0]; i++) {
                    _Outputs[0][i] = inputs[i];
                }
                var qqsout = new double[_Layers[_Layers.Length - 1]];
                for (var i = 1; i < _Layers.Length; i++) { 
                    for (var j = 0; j < _Layers[i]; j++) {// 3 
                        double before = 0;    
                        for (var k = 0; k < _Layers[i - 1]; k++) { // 5
                            before += _Outputs[i - 1][k] * _NetWeights[i - 1][k][j];//权重这个J
                        }
                        before += _Offset[i - 1][j];
                        _Outputs[i][j] = Functions[i - 1][j].Compute(before);//把三个输出层的结果发送到输出层方便调用
                    }
                }
                qqsout = _Outputs[_Layers.Length - 1];
                return qqsout;
    
            }
    
            public List<double> GetWeightsList() {
                var qws = new List<double>();
                for (var i = 0; i < _Layers.Length - 1; i++) {
                    qws.AddRange(_Offset[i]);
                }
                for (var i = 0; i < _Layers.Length - 1; i++) {
                    for (var j = 0; j < _Layers[i]; j++) {
                        qws.AddRange(_NetWeights[i][j]);
                    }
                }
                return qws;
            }
            
            public void UpdateWeights(List<double> data) {
                var id = 0;
                for (var i = 0; i < _Layers.Length - 1; i++) {
                    for (var j = 0; j < _Layers[i + 1]; j++) {
                        _Offset[i][j] = data[id];
                        id++;
                    }
                   }
    
                for (var i = 0; i < _Layers.Length - 1; i++) {
                    for (var j = 0; j < _Layers[i]; j++) {
                        for (var k = 0; k < _Layers[i + 1]; k++) {
                            _NetWeights[i][j][k] = data[id];
                            id++;
                        }
                    }
                }
            }
    
            //瞎JB写了
            public double[] ShowTimes() {  //反向传播权重更新
                List<double> currentList = new List<double>();
                for (int i = 0; i < _Layers[0]; i++)
                {
                    currentList.Add(_Outputs[0][i]);
                }
                 double a=  -(_Outputs[0][1] - 0.5f) * _Outputs[0][1] * (1 - _Outputs[0][1]);  //-(输出-样本)*输出*(1-输出);  反向传播加权
               double  b= 1 / 1 - Math.Exp(-_Outputs[0][1]);   //非线性阶段函数
                double c = Math.Tanh(_Outputs[0][1]);     //切函数
                return currentList.ToArray();  //返回更新权重  然后数值更新 *学习率
    
            }
    
      }
        
    
    
    输出处理类+接口:
    using System;
    
    
    	public interface NeurFunction {
    		double Compute(double x);
    	}
    	
    	public class SiFunction : NeurFunction
        {
    		public double Compute(double x) {
    			return  1.0 / (1.0 + Math.Exp(-x)); //非线性激活函数
    		}
    	}
    public class ThFunction : NeurFunction
    {
        public double Compute(double x)
        {
            return x > 0.0 ? 1.0 : -1.0;
        }
    }
    
    
    



    如有不懂欢迎指正;后续我会好好整理一下再把遗传算法结合的探讨一下
    展开全文
  • unreal4 源码引言

    2018-11-15 17:59:37
    unreal GIS 模块unreal4 模块与GIS结合unreal4 蓝图介绍与场景搭建 unreal4 模块与GIS结合 unreal4 蓝图介绍与场景搭建 四叉树介绍与系统衍生
  • 虚幻引擎官方文档里的从源代码构建虚幻引擎一文(链接如下)详细的讲解了怎么从gitHub下载并运行Unreal,但天有不测风云,一点错误不出现的也是不太现实的,为了防止自己忘记今天犯的错,所以现在尽可能详细的记录...
  • Unreal Engine4官方讲解实时渲染的未来(中文版),实时渲染的未来是可以预见的到的。希望后面我的游戏画面越来越好
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 什么是Unity技术美术

    千次阅读 2019-03-20 16:34:58
    技术美术,英文名是Technical Art,简称TA. 说白了就是一群既懂程序又懂美术的人。 至于技术美术是属于程序还是属于美术我们在这里不做过多讨论,要不然会打起来的。。。 反正我认为技术美术就是一名特殊的美术,...
  • unreal

    2017-10-09 09:59:10
    https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/GameFramework/APawn/index.html Pawn is the base class of all actors that can be possessed by players or AI. They are the physic
  • Unreal Engine 3

    千次阅读 2006-07-23 00:18:00
    原文地址 http://www.unrealtechnology.com/html/technology/ue30.shtmlUnreal Engine 3OverviewUnreal Engine 3 is a complete game development framework for next-generation consoles and DirectX9-equippe
  • Unreal4 入门

    万次阅读 2015-07-16 10:16:39
    使用Unreal4引擎前需要安装 或者编译引擎。 下面就为同学们介绍下 Unreal4 安装配置。 一. 在Win7下安装Unreal4 在Win7下安装Unreal4需要以下几个步骤: 1. 打开“控制面板”的“程序和功能” 检查...
  • Key Features, Learn about game development and the building blocks that go into creating a game, A simple tutorial for beginners to get acquainted with the Unreal Engine architecture, Learn about the ...
  • 2018 Unreal Open Day参会总结

    千次阅读 2018-05-26 11:59:21
    今年是第二次参加UnrealOpenDay活动,收获颇丰,也认识了很多业界大咖。这里稍微详细点的总结一下会议内容和参会心得。 首先是行程: 会议9点签到,9:45正式开始。地点和去年一样还是在宝华万豪酒店,位于上海马戏...
  • UnrealEngine VR Cookbook

    2020-07-24 17:01:31
    Unreal Engine VR Cookbook: Developing Virtual Reality with UE4 Features Step-by-step walkthroughs for building key functionality on Unreal-compatible VR hardware Comprehensive coverage, from toolkits ...
  • 这篇博客主要是深入理解蓝图整个流程的的底层机制,包括节点编辑、编译、字节码解释执行。理解了这些,对前面几篇所讲的蓝图扩展,可以有一个更清晰的认识。
  • 精通Unreal游戏引擎

    2020-07-30 23:31:58
    精通Unreal游戏引擎第一部分,太大只能分开,共两部分
  • UnrealVS扩展

    千次阅读 2015-09-02 15:17:10
    Visual Studio的UnrealVS扩展提供了在使用虚幻引擎进行开发时对常见操作的轻松访问。 功能包括: 设置启动项目。 编译启动项目的可绑定命令。 设置命令行参数。 批量编译项目。 ...
  • 精通Unreal Engine 3卷I-II

    2020-07-29 14:20:27
    《精通Unreal Engine 3卷II:3D游戏关卡设计高级篇》是您认识并掌握最新、最热门的游戏引擎Unreal Engine 3的首选指南。无论您是初次接触mod制作的爱好者,还是专业的关卡设计人员都能从本书中受益。本书包含了所有...
1 2 3 4 5 ... 20
收藏数 13,822
精华内容 5,528
关键字:

unreal