纳金网
标题:
如何使用Unity制作虚拟导览(九)
[打印本页]
作者:
艾西格亚
时间:
2014-3-19 00:13
标题:
如何使用Unity制作虚拟导览(九)
如何使用Unity制作虚拟导览(一)
http://www.narkii.com/club/thread-316986-1.html
如何使用Unity制作虚拟导览(二)
http://www.narkii.com/club/thread-316987-1.html
如何使用Unity制作虚拟导览(三)
http://www.narkii.com/club/thread-317011-1.html
如何使用Unity制作虚拟导览(四)
http://www.narkii.com/club/thread-317013-1.html
如何使用Unity制作虚拟导览(五)
http://www.narkii.com/club/thread-317451-1.html
如何使用Unity制作虚拟导览(六)
http://www.narkii.com/club/thread-317503-1.html
如何使用Unity制作虚拟导览(七)
http://www.narkii.com/club/thread-317769-1.html
如何使用Unity制作虚拟导览(八)
http://www.narkii.com/club/thread-317865-1.html
在这个教程里面,我们将要介绍交互功能的制作,例如角色走到室内时触发房门的开启,或是走入个电梯后的上升动作,而这些工作就必须交给程序来完成,以下是模拟一个角色走到触发区域时自动开门,离开触发区后关门的示范:
首先创建一个Plane,Position设置为(0,0,0),然后再增加一个Cube,将其名称更换为DoorLeaf,Position设置为 X=1, Y=1.5, Z=0 ,Scale 设置为X=2, Y=3,Z=0.1。
2014-3-19 00:07 上传
下载附件
(47.78 KB)
使用Assets > Create > C# Script 创建一个C#脚本,将其名称设置为rotateObject,双击后打开MonoDevelop进行编辑,输入以下的代码:
using UnityEngine;
using System.Collections;
public class rotateObject : MonoBehaviour {
void Update () {
this.transform.rotation = Quaternion.Euler (0,90,0);
}
复制代码
在Update里面我们使用了Quaternions Euler用来指定Y轴的旋转角度为90度,保存后将这个脚本添加到DoorLeaf的物件,然后按下播放,再按下停止看看效果。
2014-3-19 00:07 上传
下载附件
(13.42 KB)
我们会发现两个问题,一个是门会突然的打开,在停止后就回到原来的位置,另外是门的轴心在中央,这使得旋转的方式是以门的正中央为基准,显然这个不是我们需要的结果,那么应该如何修正呢?
创建一个空的Game Object,将其名称更改为Hinge,Position与Rotation皆设置为0,作用是让门的轴心位置以这个GameObject为基准点。
2014-3-19 00:07 上传
下载附件
(5.04 KB)
确认Hinge的轴心为Pivot模式,然后将DoorLeaf拖曳到Hinge成为子物件,如图所示,现在门的轴心换到了左下角的位置。
2014-3-19 00:07 上传
下载附件
(2.2 KB)
2014-3-19 00:07 上传
下载附件
(15.23 KB)
轴心的修改除了用上述的方法,也可以使用功能更强大的插件来完成:
Edit Pivot 1.3 - 任意修改轴心的插件
http://www.narkii.com/club/thread-300346-1.html
将原本在DoorLeaf上的脚本删除,再将rotateObject.cs脚本添加到Hinge,按下播放测试效果:
2014-3-19 00:07 上传
下载附件
(10.96 KB)
2014-3-19 00:07 上传
下载附件
(13.73 KB)
现在门的转动轴心没问题了,接下来就是让门的转动更为合理,我们需要一个角色的模拟,
使用第一人称的物件,让这个角色走到触发区后,门就以旋转方式开启,角色离开后门就关闭。
在原来的脚本里面我们使用了很简单的代码让门以Y轴转动90度,现在需要添加OnTriggerEntger与OnTriggerExit这两个事件来让角色进行触发与离开,具体的操作如下:
增加一个Cube在场景内,Position设置为X=1, Y=1.5, Z=0 ,scale设置为 X=2, Y=3, and Z=6,将其名称更换为DoorTrigger。
Unity内建的Cube已经具备了Box Collider,勾选Is Trigger使这个Cube具备触发器的功能,然后取消Mesh Renderer的作用,如图所示,画面中的绿色物件即为我们设置的触发区域。
2014-3-19 00:07 上传
下载附件
(21.49 KB)
为了物件的管理方便,新增一个空的Game Object,名称更换为Door,将Position设置为(0,0,0),
然后将DoorTrigger与Hinge拖曳到Door成为子物件。
2014-3-19 00:07 上传
下载附件
(5.6 KB)
将Hinge上的rotateObject脚本移除,再打开这个脚本进行修改:
using UnityEngine;
using System.Collections;
public class rotateObject : MonoBehaviour {
public GameObject Target; //指定GameObject
public float Angle = 90.0f; // 设置门的旋转角度
void OnTriggerEnter(Collider other) { //其他的物体进入触发区的动作l
Target.transform.rotation = Quaternion.Euler (0,Angle,0);
}
void OnTriggerExit(Collider other) { //物体离开触发区的动作
Target.transform.rotation = Quaternion.Euler (0,0,0);
}
}
复制代码
保存后将脚本添加到DoorTrigger,接着将Hinge添加到Traget的栏位,在进行测试前,我们需要导入第一人称的角色来配合触发区的使用。
如图所示,当角色进到触发区时,门就自动的开启90度,角色退出触发区后,门则旋转回原来的位置。
2014-3-19 00:07 上传
下载附件
(26.17 KB)
2014-3-19 00:07 上传
下载附件
(24.07 KB)
测试后发现门的打开与关闭的方式过于突然,所以我们将要的加入一个easing的方式来修正门的旋转动作,
脚本里面我们加入了以下的代码:
private float targetAngleY = 0.0f; //预计的开启角度
private float currentAngleY = 0.0f; //目前的角度
private float easing = 0.05f; //推进的微量速度
复制代码
将rotation的代码移到Update()里面,再添加以下的代码:
void Update() {
currentAngleY += (targetAngleY-currentAngleY) * easing;
Target.transform.rotation =
Quaternion.Euler (0.0f, currentAngleY, 0.0f);
}
void OnTriggerEnter(Collider other) {
targetAngleY = Angle;
currentAngleY = 0.0f;
}
void OnTriggerExit(Collider other) {
currentAngleY = Angle;
targetAngleY = 0.0f;
}
复制代码
Ok,保存后再进行测试,没问题了,角色在进入与退出触发区,门的开关动作就能模拟出缓冲的效果,也能合乎场景里面的设计需求,而这个门复制到别的位置后也是采用相同的脚本即可。
更多的技术分享与讨论请加入:
纳金网
3dsmax
技术交流群 - 284146304
纳金网Unity技术交流群 - 218689657
rotateObject.zip
2014-3-19 00:13 上传
点击文件名下载附件
467 Bytes, 下载次数: 17
作者:
hyui
时间:
2014-3-19 01:01
Thanks fore this tutorials~!!!!
作者:
HIDEOKOJIMA
时间:
2014-3-19 01:12
Thanks for sharing !
作者:
fkun.lam
时间:
2014-3-19 09:21
Thanks for sharing !
作者:
unity3D13
时间:
2014-3-19 11:11
支持原创好文章。
作者:
yuyu8823
时间:
2014-3-19 13:42
DDDDDDDDDDDDDDDD
作者:
徐徐的风
时间:
2014-3-19 13:46
Thanks for sharing!
作者:
441490848
时间:
2014-3-25 14:30
谢谢分享
作者:
unity3d-ch
时间:
2014-4-3 17:18
这个牛啊,谢谢楼主分享了
作者:
老人好快乐
时间:
2014-4-21 16:14
学习了!
作者:
gxf5168
时间:
2014-5-23 21:46
感谢楼主分享,楼主好人
欢迎光临 纳金网 (http://rs.narkii.com/club/)
Powered by Discuz! X2.5