- 最后登录
- 2024-6-28
- 注册时间
- 2012-8-10
- 阅读权限
- 100
- 积分
- 74992
- 纳金币
- 59338
- 精华
- 28
|
如何使用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。
使用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的物件,然后按下播放,再按下停止看看效果。
我们会发现两个问题,一个是门会突然的打开,在停止后就回到原来的位置,另外是门的轴心在中央,这使得旋转的方式是以门的正中央为基准,显然这个不是我们需要的结果,那么应该如何修正呢?
创建一个空的Game Object,将其名称更改为Hinge,Position与Rotation皆设置为0,作用是让门的轴心位置以这个GameObject为基准点。
确认Hinge的轴心为Pivot模式,然后将DoorLeaf拖曳到Hinge成为子物件,如图所示,现在门的轴心换到了左下角的位置。
轴心的修改除了用上述的方法,也可以使用功能更强大的插件来完成:
Edit Pivot 1.3 - 任意修改轴心的插件
http://www.narkii.com/club/thread-300346-1.html
将原本在DoorLeaf上的脚本删除,再将rotateObject.cs脚本添加到Hinge,按下播放测试效果:
现在门的转动轴心没问题了,接下来就是让门的转动更为合理,我们需要一个角色的模拟,
使用第一人称的物件,让这个角色走到触发区后,门就以旋转方式开启,角色离开后门就关闭。
在原来的脚本里面我们使用了很简单的代码让门以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的作用,如图所示,画面中的绿色物件即为我们设置的触发区域。
为了物件的管理方便,新增一个空的Game Object,名称更换为Door,将Position设置为(0,0,0),
然后将DoorTrigger与Hinge拖曳到Door成为子物件。
将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度,角色退出触发区后,门则旋转回原来的位置。
测试后发现门的打开与关闭的方式过于突然,所以我们将要的加入一个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
|
-
总评分: 纳金币 + 10
查看全部评分
|