解读UE4家装Demo《HomeDecoration》的蓝图实现

因项目需要,最近在学习UE4。相比Unity确实比较难上手,但如果有Unity基础,可以很快理解UE4里面的概念,比如Actor对应Unity的GameObject,ActorComponent对应Unity的Component,而UE4还多了很多像Pawn、Character、PlayerController等等的类或者概念,需要时间适应。

UE4的项目可以用纯蓝图、纯C++或者蓝图结合C++三种实现方式,我建议程序员一开始就直接学C++的实现方式,因为蓝图里面的对象、函数、事件都是跟C++里的代码一一对应的,学了C++的实现,能更好的理解和使用蓝图。写写蓝图就是为了养生和方便非程序员使用,我还是觉得写代码比较高效率,无论是编写、阅读和维护,都是更高效的。

正式内容

下面要讲的项目是网上的一个家装DEMO,名字是HomeDecoration,项目纯用蓝图实现,实现了简单的家具拖动和换材质的功能。

文末可附上项目下载地址

在这里插入图片描述

ROOM 关卡蓝图

BeginPlay事件

设置UMG,给每个baseMoveActor设置ActorCamera为Camera3D

按键事件

键盘1和2,控制相机切换
在这里插入图片描述

OperationManager

Event BeginPlay

设置 playercontroller引用

HandMouseClick(custom event)

在MyPlayerController里调用

若点击到物体的ObjectType为Shafa或Arrow,把物体设置成TempCurrentObeject。然后,若该物体不为CurrentObj,且不为ArrowActor,那就调用setDepthFalse和setCollisionEnableAndArrow,obj为把currentOb。再调用setDepthTrue,obj为TempCurObj。最后调用setCollisionDisableAndArrow,obj为curObj。

setDepthFalse

给物体的所有mesh调用SetRenderCustomDepth为False

setDepthTrue

给物体的所有mesh调用SetRenderCustomDepth为True,并调用SetCurrentObjectState

setCollisionDisableAndArrow

SetCurrentObjectState(custom event)

setDepthTrue中调用

设置currentObj,同时给playerctrl设置currentSelectedObj,若obj是baseMoveActor,获取它的Material,转成Material,设置给playercontrl的preSelectedMaterial,然后设置它的Material为BaseMaterial(选中状态)

MyPlayerController

  • 键盘快捷键事件

  • 传递鼠标左键事件给OperationManager

  • 历史列表操作

Camera3D(Pawn)

在这里插入图片描述

  1. InputEvent模块,鼠标移动和键盘w/s输入事件
  • 获取鼠标移动数值,赋值给mouseX和mouseY变量

  • 获取MoveForward(键盘w)、MoveBack(键盘s)输入事件,设置isMoveForward和isMoveBack变量。这两个变量属于flag类型的变量,用于后面EventTick中控制镜头移动。

  1. EventTick
    在这里插入图片描述
    EventTick->判断是否3DLock->若否,顺序执行下面的事件

Camera moving of view in 3D view

事件:Tick、鼠标中键

在这里插入图片描述

鼠标中键控制Gate的open和close,Gate初始化为closed。

具体功能是,鼠标中键按下时,Gate为open,此时鼠标移动控制Camera3D在地板上平移;鼠标松开时,即gate为close时不控制。

RotationAngleOfViewIn3DView

在这里插入图片描述

鼠标右键控制镜头旋转

IsMoveForward 和 IsMoveBack

在这里插入图片描述

通过两个flag来控制事件是否执行

ArrowActor

BeginPlay事件

赋值Camera3D_ref变量,并记录其location,复制给tempLocation

Event Tick

Handle mouse cursor leave 3D arrow when mouse be pressed

IsClicked Flag触发执行,根据MyPlayerController的IsLeftMouseDown判断执行ArrowClickEvent还是ArrowReleaseEvent

Handle 3d arrow scale when camera3d moving far

bInit Flag触发执行,如果camra3d位置远离上次位置超过一定距离, 改变arrow得scale

3D Arrow color change when mouse cursor across and click on it和Determine the left arrow or mouse release on 3d arrow and set color

  • 鼠标划过,设置相应参数,设置Arrow颜色

  • 鼠标点击,设置相应参数,设置Arrow颜色

  • SetArrowColor是一个自定义的函数,通过动态材质修改颜色

  • 鼠标离开,恢复初始化颜色

BaseMoveActor

1. 【Event BeginPlay】

注释为:init

赋值MyPlayerController_Ref,setArrowHide,Bind arrow event
三个Arrow Actor set visibility?(不设置的话,箭头不会显示)
接着执行下面的模块

Calculating model’s length、width、high

获取Actor的Bounds,经过运算,记录网格中心点,用于吸附

2. 【EventTick】

Handle model rotation, let 3d arrow always toward world rotation

设置三个arrow的朝向

Handle 3D Arrow Moving and direction

控制模型移动

Handle model sorption

xifu flag 控制是否执行吸附事件

3.【OnBeginCursorOver】

注释为:change model's material when drag material from umg panel

作用:设置材质

Tags为Move时,

若PlayerController的MaterialTypeStruct为Avaiable时(应该就是选中材质的时候),且Type为一样的类型(如都是PiGe),则把MaterialTypeStruct的value赋值给material,并把该value设置为playctrl里的preSelectedMaterial。

接着,重置MaterialTypeStruct。若PlayerContrl中curSeletedObj为当前物体,设置collision为enable(type作用不详?)。

Tags不为move时(不知道哪里设置的,如floorStaticMeshActor),重置MaterialTypeData

4.【OnClicked】

注释为:set 3d arrow show state

作用:点击物体,显示指针

点击mesh触发执行,’set arrow hide in game‘。

点击mesh,选中物体,显示arrow。再点击不进入该方法,不知道原因。

5. Event HandleXiFu 吸附

还没看这段

Add a Comment

电子邮件地址不会被公开。 必填项已用*标注