4. 交互功能(自动开关门)
4.1 ControllerColliderHit(碰撞检测)
玩家撞到门时,门才能开。
其相关代码如下所示,需要对模型的动画进行分割,以下脚本绑在
玩家身上:
[javascript] view plaincopy
1. #pragma strict
2. private var doorisopen:boolean = false;
3. private var doortimer:float = 0.0;
4. private var currentdoor:GameObject;
5.
6. var door_open_time:float = 5.0;
7. var door_open_sound:AudioClip;
8. var door_shut_sound:AudioClip;
9.
10. function Update(){
11.
if(doorisopen){
12.
13.
14.
15.
16.
17.
18.
19. }
20.
21. //检测玩家是否与门相撞
22. function OnControllerColliderHit(hitt:ControllerColliderHit){ //hitt 为与玩家
doortimer = 0.0;
door(false,door_shut_sound,"doorshut",currentdoor);
if(doortimer > door_open_time) {
doortimer += Time.deltaTime;
}
}
相撞的碰撞体
print("test1");
if(hitt.gameObject.tag == "playerDoor" && doorisopen == false){
print("test2");
door(true,door_open_sound,"dooropen",hitt.gameObject);
currentdoor = hitt.gameObject;
}
23.
24.
25.
26.
27.
28.
29. }
30.
31. function door(doorcheck:boolean,a_clip:AudioClip,ani_name:String,thisdoor:Ga
meObject){
doorisopen=doorcheck;
thisdoor.audio.PlayOneShot(a_clip); //声音取消 3D 效果,否则无法播放
thisdoor.transform.parent.animation.Play(ani_name);
32.
33.
34.
35. }
4.2 RaycastHit(光线投射)
玩家必须面对门时,光线投射到门时,门才能开。
其检测碰撞代码如下所示,以下脚本绑在玩家身上:
[javascript] view plaincopy
var hit:RaycastHit; //hit 为与投射光线相遇的碰撞体
if(Physics.Raycast(transform.position,transform.forward,hit,3)){
print("collider happen" + hit.collider.gameObject.tag);
if(hit.collider.gameObject.tag == "playerDoor"){
var currentdoor:GameObject = hit.collider.gameObject;
currentdoor.SendMessage("doorcheck");
print("call doorcheck");
1. function Update(){
2.
3.
4.
5.
6.
7.
8.
9.
10.
11. }
}
}
门身上的脚本如下所示:
[javascript] view plaincopy
1. #pragma strict
2.
3. private var doorisopen:boolean = false;
4. private var doortimer:float = 0.0;
5. //private var currentdoor:GameObject;
doortimer += Time.deltaTime;
if(doortimer > door_open_time) {
doortimer = 0.0;
door(false,door_shut_sound,"doorshut");
6.
7. var door_open_time:float = 5.0;
8. var door_open_sound:AudioClip;
9. var door_shut_sound:AudioClip;
10.
11. function Update(){
12.
if(doorisopen){
13.
14.
15.
16.
17.
18.
19.
20. }
21.
22. function doorcheck(){
23.
if(!doorisopen){
24.
25.
26. }
27.
28. function door(doorcheck:boolean,a_clip:AudioClip,ani_name:String){
29.
30.
31.
32. }
doorisopen=doorcheck;
audio.PlayOneShot(a_clip); //声音取消 3D 效果,否则无法播放
transform.parent.animation.Play(ani_name);
door(true,door_open_sound,"dooropen");
}
}
}
4.3 OnTriggerEnter(触发器)
只要一进入触发区域,门就可以打开。需要特别注意调整小房子
的 Box Collider 的大小和位置。
以下脚本绑在门所在的小房子上:
[javascript] view plaincopy
1. #pragma strict
2.
3. function OnTriggerEnter (col:Collider) { //col 为闯入此区域的碰撞体
4.
5.
6.
7. }
transform.FindChild("door").SendMessage("doorcheck");
if(col.gameObject.tag == "Player"){
}
4.4 OnCollisionEnter
检测两个普通碰撞体之间的碰撞,需要发力,才能发生碰撞。
不能与第一人称控制器发生碰撞。
4.5 交互总结
1) OnControllerColliderHit
专门提供给角色控制器使用,以供角色控制器检测与其它物体
发生了碰撞。
它与触发模式的碰撞体不能发生碰撞,而且还会穿过其物体。
以下脚本绑定在玩家(第一人称控制器)身上。
[javascript] view plaincopy
1. function OnControllerColliderHit (hit:ControllerColliderHit) {
2.
3.
4. }
if(hit.gameObject.name != "Plane")
gameObject.Find("wenzi").guiText.text = hit.gameObject.name;
2) RaycastHit
它不是一个事件,而是一个命令,可以需要的地方调用它来发
射一条光线来进行检测。
可以与触发模式的碰撞体发生碰撞,但也会穿过其物体。
以下脚本绑定在玩家(第一人称控制器)身上。
[javascript] view plaincopy
1. #pragma strict
2. var hit:RaycastHit;
3. function Update () {
4.
5.
6.
gameObject.Find("wenzi").guiText.text = hit.collider.gameObject.
if(Physics.Raycast(transform.position,transform.forward,hit,2)){
if(hit.collider.gameObject.name != "Plane"){
name;
}
}
7.
8.
9. }
3) OnTriggerEnter
以下脚本绑定在与第一人称控制器相撞的物体上。
[javascript] view plaincopy
1. #pragma strict
2. function OnTriggerEnter (col:Collider) {
3.
4. }
gameObject.Find("wenzi").guiText.text = col.gameObject.name;
4) OnCollisionEnter
检测两个普通碰撞体之间的碰撞,需要发力,才能发生碰撞。
不能与第一人称控制器发生碰撞。