纳金网

标题: 如何使用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。

1.png

使用Assets > Create > C# Script 创建一个C#脚本,将其名称设置为rotateObject,双击后打开MonoDevelop进行编辑,输入以下的代码:
  1. using UnityEngine;
  2. using System.Collections;

  3. public class rotateObject : MonoBehaviour {

  4. void Update () {
  5.         this.transform.rotation = Quaternion.Euler (0,90,0);
  6. }
复制代码
在Update里面我们使用了Quaternions Euler用来指定Y轴的旋转角度为90度,保存后将这个脚本添加到DoorLeaf的物件,然后按下播放,再按下停止看看效果。

2.png

我们会发现两个问题,一个是门会突然的打开,在停止后就回到原来的位置,另外是门的轴心在中央,这使得旋转的方式是以门的正中央为基准,显然这个不是我们需要的结果,那么应该如何修正呢?

创建一个空的Game Object,将其名称更改为Hinge,Position与Rotation皆设置为0,作用是让门的轴心位置以这个GameObject为基准点。

3.png

确认Hinge的轴心为Pivot模式,然后将DoorLeaf拖曳到Hinge成为子物件,如图所示,现在门的轴心换到了左下角的位置。

4.png

5.png

轴心的修改除了用上述的方法,也可以使用功能更强大的插件来完成:
Edit Pivot 1.3 - 任意修改轴心的插件
http://www.narkii.com/club/thread-300346-1.html

将原本在DoorLeaf上的脚本删除,再将rotateObject.cs脚本添加到Hinge,按下播放测试效果:

6.png
7.png

现在门的转动轴心没问题了,接下来就是让门的转动更为合理,我们需要一个角色的模拟,
使用第一人称的物件,让这个角色走到触发区后,门就以旋转方式开启,角色离开后门就关闭。


在原来的脚本里面我们使用了很简单的代码让门以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的作用,如图所示,画面中的绿色物件即为我们设置的触发区域。

8.png

为了物件的管理方便,新增一个空的Game Object,名称更换为Door,将Position设置为(0,0,0),
然后将DoorTrigger与Hinge拖曳到Door成为子物件。

9.png

将Hinge上的rotateObject脚本移除,再打开这个脚本进行修改:
  1. using UnityEngine;
  2. using System.Collections;
  3. public class rotateObject : MonoBehaviour {

  4. public GameObject Target;  //指定GameObject
  5. public float Angle = 90.0f;  // 设置门的旋转角度

  6. void OnTriggerEnter(Collider other) {  //其他的物体进入触发区的动作l
  7.       Target.transform.rotation = Quaternion.Euler (0,Angle,0);
  8. }
  9. void OnTriggerExit(Collider other) {  //物体离开触发区的动作
  10.       Target.transform.rotation = Quaternion.Euler (0,0,0);
  11. }
  12. }
复制代码
保存后将脚本添加到DoorTrigger,接着将Hinge添加到Traget的栏位,在进行测试前,我们需要导入第一人称的角色来配合触发区的使用。

如图所示,当角色进到触发区时,门就自动的开启90度,角色退出触发区后,门则旋转回原来的位置。

10.png
11.png

测试后发现门的打开与关闭的方式过于突然,所以我们将要的加入一个easing的方式来修正门的旋转动作,

脚本里面我们加入了以下的代码:
  1. private float targetAngleY = 0.0f;  //预计的开启角度
  2. private float currentAngleY = 0.0f;  //目前的角度
  3. private float easing = 0.05f;  //推进的微量速度
复制代码
将rotation的代码移到Update()里面,再添加以下的代码:
  1. void Update() {
  2.   currentAngleY += (targetAngleY-currentAngleY) * easing;
  3.       Target.transform.rotation =
  4. Quaternion.Euler (0.0f, currentAngleY, 0.0f);
  5. }

  6. void OnTriggerEnter(Collider other) {
  7.   targetAngleY = Angle;
  8.       currentAngleY = 0.0f;
  9. }

  10. void OnTriggerExit(Collider other) {
  11.   currentAngleY = Angle;
  12.       targetAngleY = 0.0f;
  13. }
复制代码
Ok,保存后再进行测试,没问题了,角色在进入与退出触发区,门的开关动作就能模拟出缓冲的效果,也能合乎场景里面的设计需求,而这个门复制到别的位置后也是采用相同的脚本即可。

更多的技术分享与讨论请加入:
纳金网3dsmax技术交流群 - 284146304
纳金网Unity技术交流群 - 218689657

rotateObject.zip

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://c-www.narkii.com/club/) Powered by Discuz! X2.5