从Unity学UE(一)之蓝图类的使用----制作一个可控灯光
- using UnityEngine;
- using System.Collections;
- public class MyLight : MonoBehaviour {
- public Light light;
- public TextMesh helperMessage;
- void OnTriggerStay(Collider col)
- {
- if(col.name == "Player")
- {
- helperMessage.text = "Press F to toggle";
- if(Input.GetKeyDown(KeyCode.F))
- {
- if(light.intensity >0)
- light.intensity = 0;
- else
- light.intensity = 6;
- }
- }
- }
- void OnTriggerExit(Collider col)
- {
- if(col.name == "Player")
- {
- helperMessage.text = "";
- }
- }
- }
3.首先做个热身,我们在关卡蓝图里面控制一下开关灯,就是这个灯啦
4.删掉它,我们自己创建!
5.首先建立一个新的蓝图类,方法有很多,我们直接在上面的蓝图选项内建立一个空的Actor类蓝图,取名MyLight,过程如下图:
4.首先添加第一个组件:网格组件。我们可以直接在左上角的添加组件下拉菜单中选择静态网格,这里有个小技巧,在选择添加组件之前在项目的资源项那里选中网格,这样就会添加到这个网格组件,不然,就只能在右面自己指定了
5.这样,网格组件就添加成功了,其实就和Unity里面给一个空物体GameObject添加网格渲染组件差不多,其实等下我们做完以后就会发现,整个添加组件的过程和Unity也没多少差别。组件添加成功后,我们可以在视窗中进行浏览,这时候可得好好熟悉一下操作了,比如选中组件,按住Alt键加鼠标左键,可以围绕网格旋转,Alt+右键可以缩放,实在觉得有点不适合,也可以把右上角相机速度调小,然后慢慢适应。
6.接下来,添加灯光,我们这里就简单的做个演示,添加一个聚光灯spotLight就好啦。同样道理,选中添加组件,找到spotLight。把镜头拉远,我们发现这个聚光灯的方向不对,然后就在右边进行旋转,移动什么的吧,知道你调整到一个合适的位置。这里补充一下,其实,我们这时候就可以在内容浏览器里面找到我们刚刚创建的蓝图类,然后把它拖放到墙上合适的位置。这时候我们就可以边在蓝图类的视口中作调整,边在场景视图中看到变化了!这里还要注意,这样做了以后,一定要确保,你移动或者选转的是类图视图内的聚光灯,而不是视图中的,因为我们要调整的是这个类,而不是你刚刚放在墙上的这个类的一个对象!!不然你做的调整只适应一个对象!
7.关于灯光的一些属性,其实很简单,大家自己摸索一下就出来了,比如Intensity就是说灯光的强度,color就是颜色,还有内角度外角度,等等,我们这里可以调整一下灯光的颜色,和外角度,使得灯光看上去就是从灯本身的外边缘投射出来一样。如图
8.继续添加组件!我们添加一个cubecollision组件,相信看到这个名字,我们也能猜到这个和碰撞有关,这应该不用多做解释了吧!
这里看上面这张截图,说明两点,1.刚刚忘记说了,我们也要为自己的组件合理的命名,这样在以后复杂的类中方便查阅。2.从这里也可以看出,就像我上篇文章翻译的,UE4的组件是有层级关系的。注意对我们的触发的矩形做一些调整,方便我们等下测试!
8.到了这一步,我们的准备工作就算基本完成了。接下来,我们用逻辑来控制等的开关。在灯光的属性中,有一项是Visiable,选中SpotLight,在右面就可以看到,我们正是对这一个布尔值修改,来控制灯的开关!
9.我们这时候观察一下这个蓝图的界面,其实除了我们正在操作的视口标签,还有两个标签,一个是ConstructionScript构造函数,一个是事件图表。我们接下来就使用事件列表来处理这个简单的逻辑。
10.相信看过我上一篇文章的童鞋对这三个节点一定不会陌生,这三个事件函数,实际上就和Unity里面的start()等那三个函数差不多。不过,我们要处理的逻辑是:当玩家进入到触发器,触发一个函数,这个函数用来处理灯光的开关。所以这里暂时不会用到系统默认提供给我们的这三个事件函数。
同时,我们继续看上面这张截图,还有一个重要的信息,我们可以看到左边添加的组件,而这些组件可以直接拖拽到右面的蓝图图表中进行引用,而不是向Unity里面还需要申明一个Public的变量,再到编辑器里面做指定。这就是在上篇文章中我们提到的UE4的一个便利之处!好吧,那我们就体会体会!
11.想清楚,我们相应的是一个碰撞检测的函数,就和unity里面的OnTriggerEnter一样,所以,首先我们添加碰撞的检测事件!选中TriggerVolume组件,在右面右键,选择为其添加事件,Collision,OnComponentBeginOverLap
暂时先这样,等下回来更新!
接着吧。(为了方便之前看过的童鞋迅速定位,就保留这一行了)
12.上面截图所示的三个碰撞函数和我们在Unity里面使用的相同,尽管大胆的用即可。接下来,把SpotLight灯光拖拽下来,并在其外引出另外的一个节点:ToggleVisibility(可以使用搜索)。这个节点的含义就是说碰撞来决定是否可视,如下图连接
这时,就可以进入游戏测试一下,你会发现,当你靠近灯的时候,灯会变亮,离开的时候,灯会边暗。
13.接下来,我们添加另外一个功能,一个人只有靠近灯的时候,他才可以按键开关灯,当他远离的时候,按键失效。和上面的Unity工程一样,我们先创建一个提示性的语句,这就是另外一个组件TextRender。首先我们撤销两个碰撞函数的连线,方法很简单,按住键盘Alt键,然后单击端口即可。
14。和Unity一样,进入碰撞区域输入有效,出去则无效。使用另外两个节点:enable input和disable input,这两个节点可能得关闭情景才能出来,然后按照下图连接上半部分:输入的控制功能:
14.OK,这样输入控制就好了,接着我们继续完成,在输入控制完成后,我们就写一下按键的相应了,相应按键更简单,右键空白部分,输入F即可,如下图
这时候进入游戏测试,发现只有当靠近灯的时候,才能通过按F键打开或者关闭灯
15.最后一步,就是完善提示内容:按照下图连接即可。
好了,这时候就可以进入游戏测试了。
16.最后关于蓝图,还要补充一点,就是蓝图的注释,先把相关节点全部框选,就可以输入注释信息了。好了,贴个最终版的蓝图上来,大家可以做参考。
17.最后我们来体会一下蓝图类的强大之处,好吧其实也就是和Unity里面的预设差不多,其实我们上面蓝图写的功能完全可以在关卡蓝图里面来实现,但是关卡蓝图里面的节点无法直接共享到其他关卡,实在想共享,就得有相同的节点。而蓝图类,则相当于是一个普通的游戏物体,可以随便拖放到任意位置。比如,这里,我们把创建好的蓝图类在场景视图中多拖放几处,不用再多填一处代码,都可以实现相同的功能。大家自己尝试一下即可,这里就不贴图了。
18.最后我们来看一下蓝图的构造函数部分,我们可以在这里实现这样的功能:我们刚刚使用预设复制了很多具有同样功能的灯,但是他们现在完全一模一样!如果我们让他们的一些属性不同该怎么办?比如发出光的颜色不一样?是不是可以在构造的时候就可以调节?能不能直接在编辑器中调节?好吧,这些内容就可以在构造函数部分可以做到了。有了上面的经验,我们想要在构造函数部分连出下面这么一张图应该不成问题。
好啦,具体内容已在截图中说清,编译保存后,我们到编辑器中看看效果!有一点要注意,这两个变量必须是可编辑的,注意选中detail面板的可编辑这一项,选中就表明这两个变量是公有的,接下来,编辑器中就有这两项啦!和Unity一样吧!
第三部分:总结
一. 一起来回忆一下,我们刚刚在UE4中做了哪些事情?
1.添加组件
2.在一个物体的蓝图上,随意调用其组件,这一点来说,比Unity的脚本确实方便不少
3.简单接触了UE4的碰撞事件
二. UE4 的蓝图和UE3的 kismet的一点区别:
1.UE4中不能用同一个事件同时驱动多个节点,因为无法保证哪一个事件先发生,但是kismet是可以的。如下图:
2.取而代之,在UE4中是写成顺序结构,这是便解决了刚刚提到的问题
三.我们现在已经很方便的解决同一物体的组件间的访问,相比Unity,接下来还有一个问题要解决,那就是如何处理物体和物体之间的访问。就是说,我们怎么样才能真正理解Unity里面的代码的拖放,为什么只要写一个public变量,不管代码在哪里都可以拖动?这里面的机制是怎样?如果要在UE4中实现,又该怎么办?这部分内容等我学习了之后,再来为大家总结。
好了,今天就到这里吧。
最后,如果需要转载,请注明来源,谢谢~
从Unity学UE(一)之蓝图类的使用----制作一个可控灯光的更多相关文章
- 【Unity】6.7 向量和Vector3类
分类:Unity.C#.VS2015 创建日期:2016-04-20 一.简介 在虚拟的游戏世界中,与3D有关的数学知识决定了游戏引擎如何计算和模拟出开发者以及玩家看到的每一帧画面.学习或者回想一下基 ...
- Unity编辑器 - 资源批处理工具基类
Unity编辑器 - 资源批处理工具基类 经常要对资源进行批处理,很多时候都是一次性的需求,于是弄个通用脚本. 工具是个弹出面板,处理过程有进度条,如下: 如图,子类只需要重写几个方法: using ...
- ue4-C++中加载一个蓝图类(二)-C++中绑定Blueprint武器
editor中编辑好一个武器蓝图资源后,c++中create出这个武器,然后attach到一个人物身上. 思路: 写个c++基类,蓝图继承后编辑成武器或其他装备,然后c++用一个TSubclassO ...
- Java从零开始学二十八(Math类和Random类)
一.Math概述 提供了常用的数学运算方法和两个静态常量E(自然对数的底数)和PI(圆周率) 二.常用方法 package com.pb.demo1; public class MathTest { ...
- cardboard sdk for unity 系统分析 - 属性行为分析CardBoard类
一.CardBoard类是个单例类,全局只有一个CardBoard对像且在需要时才生成: CardBoard中主要使用了BaseVRDevice device这个对像,而这个对像也是单例类BaseVR ...
- Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机
Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现的 ...
- Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序执行生命周期中,使用了单类模式的类仅仅能有一个实例对象存在。
...
- C++PE文件格式解析类(轻松制作自己的PE文件解析器)
PE是Portable Executable File Format(可移植的运行体)简写,它是眼下Windows平台上的主流可运行文件格式. PE文件里包括的内容非常多,详细我就不在这解释了,有兴趣 ...
- Unity 2D游戏开发高速入门第1章创建一个简单的2D游戏
Unity 2D游戏开发高速入门第1章创建一个简单的2D游戏 即使是如今,非常多初学游戏开发的同学.在谈到Unity的时候.依旧会觉得Unity仅仅能用于制作3D游戏的. 实际上.Unity在2013 ...
随机推荐
- 机器学习(Machine Learning)&深入学习(Deep Learning)资料
<Brief History of Machine Learning> 介绍:这是一篇介绍机器学习历史的文章,介绍很全面,从感知机.神经网络.决策树.SVM.Adaboost 到随机森林. ...
- [Ubuntu] Error: The disk drive for /media/sda2 is not ready yet or not present
After updated Ubuntu, and reboot, I got these error The disk drive for /media/sda2 is not ready yet ...
- Ceph的状态错误
使用命令检查ceph集群的监控状态,得到 [root@node1 ~]# ceph -s cluster c4898b1c-7ac1-406d-bb5d-d3c7980de438 health HEA ...
- 原生js获取execl里面的值 主要使用ActiveXObject
今天一个程序员给了一个excel表,里面有一百多条数据,叫我一个一个数据的复制到系相应的函数里面比如 put("gaga1","gaga2"),这样一句话,要我 ...
- android 项目学习随笔一(闪屏 )
1.取标题栏且全屏 <activity android:name="com.ecollab.zhsh66.SplashActivity" android:label=&quo ...
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一. 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...
- html5 canvas 笔记三(绘制文本和图片)
绘制文本 fillText(text, x, y [, maxWidth]) 在指定的(x,y)位置填充指定的文本,绘制的最大宽度是可选的. strokeText(text, x, y [, ma ...
- netstat -aon|findstr 8888 终止进程
netstat -aon|findstr 8888 # 根据端口号查找进程C:\Users\Administrator>netstat -ano | findstr TCP LISTENING ...
- array_pop()将数组最后一个单元弹出(出栈)
// 使用系统函数中的引用传参 $array = [1,2,3,4,5,6,7,8,9];//数组 // 调用一个函数 array_pop($array); //输出原数组 ...
- Codeforces 741B:Arpa's weak amphitheater and Mehrdad's valuable Hoses(01背包+并查集)
http://codeforces.com/contest/741/problem/B 题意:有 n 个人,每个人有一个花费 w[i] 和价值 b[i],给出 m 条边,代表第 i 和 j 个人是一个 ...