解读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 吸附

还没看这段

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DvLee1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值