从Unity学UE(一)之蓝图类的使用----制作一个可控灯光

新学期开始了,我又来更博了,自从UE4免费以来,每天都很兴奋有木有!于是博主从家乡花了一天时间到达学校后的第一时间就又开始学习起了UE4,联系上回内容,这次我们继续体会Unity引擎和UE4相似之处。在这片文章中,我们将分别在两个引擎中创建一个可以控制开关的灯,来对比一下两个引擎,同时我们将会学到,如何在UE4中使用蓝图创建一个可以交互的物体。好了,废话不多说,开始吧

首先申明,本文章内容适合有Unity引擎基础的童鞋享用,如果不了解Unity引擎,请跳过第一部分即可,内容较为基础,大神们可以绕道而行啦~

第一部分:Unity引擎

在Unity里实现这个功能是非常简单的,我就随便给大家提供一种方法,我直接上截图,很容易理解:        

这部分内容不是今天的重点,我只做大概说明:

1.首先第一张截图:我创建了一个空物体,然后在上面添加cube碰撞体,调整起大小,另外因外要在这里做碰撞检测,所以我添加了rigidbody组件,然后写了碰撞的脚本。

2.第二张图,我随意建立了一个cube物体,作为我们的灯,然后在里面添加了点光源

3.第三张图,就是起到提示功能,创建的是一个3dText。

4.我添加了一个自带的第一人称控制器做测试

5.第一张图片中空物体上绑定的脚本:

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 = "";
		}
	}
}

7.最终效果如图:当走进一个灯的时候,灯下面会出现提示信息,并且在这个范围内,按下F键会打开或关闭灯。       

好了,就是这样,点击下面的链接,可以查看到Unity的源工程

http://pan.baidu.com/s/1o6FUdr8

第二部分:UE4引擎

这部分是我们的重点内容,其实这些是UE4官方的英文教学视频,我把它整理了一下,和大家一起分享。

1.创建一个新的工程,如下图,我们选择蓝图,空白,具有初学者内容。

2.打开UE4给我们提供的一个map,就是下面这个

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里面的预设差不多,其实我们上面蓝图写的功能完全可以在关卡蓝图里面来实现,但是关卡蓝图里面的节点无法直接共享到其他关卡,实在想共享,就得有相同的节点。而蓝图类,则相当于是一个普通的游戏物体,可以随便拖放到任意位置。比如,这里,我们把创建好的蓝图类在场景视图中多拖放几处,不用再多填一处代码,都可以实现相同的功能。大家自己尝试一下即可,这里就不贴图了。

第三部分:总结

一. 一起来回忆一下,我们刚刚在UE4中做了哪些事情?

1.添加组件

2.在一个物体的蓝图上,随意调用其组件,这一点来说,比Unity的脚本确实方便不少

3.简单接触了UE4的碰撞事件

二. UE4 的蓝图和UE3的 kismet的一点区别:

1.UE4中不能用同一个事件同时驱动多个节点,因为无法保证哪一个事件先发生,但是kismet是可以的。如下图:

2.取而代之,在UE4中是写成顺序结构,这是便解决了刚刚提到的问题

三.我们现在已经很方便的解决同一物体的组件间的访问,相比Unity,接下来还有一个问题要解决,那就是如何处理物体和物体之间的访问。就是说,我们怎么样才能真正理解Unity里面的代码的拖放,为什么只要写一个public变量,不管代码在哪里都可以拖动?这里面的机制是怎样?如果要在UE4中实现,又该怎么办?这部分内容等我学习了之后,再来为大家总结。

好了,今天就到这里吧。

最后,如果需要转载,请注明来源,谢谢~

时间: 2024-08-03 13:38:02

从Unity学UE(一)之蓝图类的使用----制作一个可控灯光的相关文章

学java教程之String类

学编程吧学java教程之String类发布了,欢迎通过xuebiancheng8.com来访问 java类中的String类应该是用的最多的一个类,我们时时刻刻都离不开String类,时时刻刻都在用,面试的时候经常考,比方说问String类是不是基本数据类型.答案是否定了,String类不是基本数据类型,只不过String类和基本数据类型的用法很相似. 下面来看String类的用法. String str= “abc”;//定义了一个字符串abc String str1= new String(

Unity 侦听进入播放模式、Unity加载时初始化编辑器类

"Editor"文件夹下的PlayModeStateChangedHandler.cs using UnityEngine; using UnityEditor; //允许在 Unity 加载时初始化编辑器类,无需用户操作. [InitializeOnLoadAttribute] public static class PlayModeStateChangedHandler{ //初始化类时,注册事件处理函数 static PlayModeStateChangedHandler(){

Java从零开始学二十八(Math类和Random类)

一.Math概述 提供了常用的数学运算方法和两个静态常量E(自然对数的底数)和PI(圆周率) 二.常用方法 package com.pb.demo1; public class MathTest { public static void main(String[] args) { System.out.println("求平方根:" + Math.sqrt(9.0)); System.out.println("求两数的最大值:" + Math.max(10,30))

cardboard sdk for unity 系统分析 - 属性行为分析CardBoard类

一.CardBoard类是个单例类,全局只有一个CardBoard对像且在需要时才生成: CardBoard中主要使用了BaseVRDevice device这个对像,而这个对像也是单例类BaseVRDevice的惟一对像: CardboardAndroidDevice继承于BaseVRDevice: 所以相互作用的对像为CardboardAndroidDevice的惟一对像: 因此,可以说整个应用通过cardboard对像来进行各种设置,而cardboard对像又是通过对cardboardan

每天学一点Scala之 伴生类和伴生对象

1.  object 相当于class的单个实例,因此,在object里声明的变量都是静态变量,静态方法 2.  在object里声明的变量,都是全局变量,也就是类的公共属性,或者类似于java中父类的属性 3.  object里的构造器,也就是object 内部不在method中的代码,都属于构造器的内容 4. 同样,object的主构造器只会在第一次调用时执行,多次调用,只会执行一次. object使用场景 1.  单例模式 2.  工具类 伴生对象与 伴生类? 如果有一个class,还有一

如何制作一个类马里奥的横版平台动作游戏 续

欢迎回来,上篇我们讲到了物理引擎中重力环境模拟以及主角考拉与地面墙壁的碰撞,相信大家已经对2D世界的物理模拟有了一定的了解,现在我们接着讲如何让考拉动起来吧! 让考拉动起来! 这里控制考拉移动变得非常简单,它只有向前和跳两个能力(源码中我加了考拉向后走功能,建议大家自己加几个虚拟按键来实现更非富的功能)如果你按着屏幕左半部考拉会向前走,按住右半部考拉会跳起来(原文设定考拉不会后退-_-). 我们需要在Player.h里加两个成员变量: bool _forwardMarch;  //是否向前走 b

cocos2d-x 如何制作一个类马里奥的横版平台动作游戏续 2

     欢迎回来,上篇我们讲到了物理引擎中重力环境模拟以及主角考拉与地面墙壁的碰撞,相信大家已经对2D世界的物理模拟有了一定的了解,现在我们接着讲如何让考拉动起来吧! 让考拉动起来!    这里控制考拉移动变得非常简单,它只有向前和跳两个能力(源码中我加了考拉向后走功能,建议大家自己加几个虚拟按键来实现更非富的功能)如果你按着屏幕左半部考拉会向前走,按住右半部考拉会跳起来(原文设定考拉不会后退-_-).    我们需要在Player.h里加两个成员变量:    bool _forwardMar

Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏

Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏 即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的.实际上,Unity在2013年发布4.3版本的时候,就开始提供对制作2D游戏的支持了.例如,提供了一些专用于开发2D游戏的Unity工具.现在Unity已经发布了版本4.5,对2D游戏的支持更是完善了不少.为了说明Unity对2D游戏所提供的支持,本章会使用这些在Unity中原生的工具,开发一个简单的2D游戏.本文选自<Unity

【Unity Shaders】Reflecting Your World —— 在Unity3D中创建一个简单的动态Cubemap系统

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 我们已经学了很多关于反射的内容,但是我们现在的反射并不能实时反射,即当反射物体移动时它们不