logo资料库

unity 交互功能(自动开关门).docx

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
4. 交互功能(自动开关门)
4.1 ControllerColliderHit(碰撞检测)    
4.2 RaycastHit(光线投射)
4.3 OnTriggerEnter(触发器)
4.4 OnCollisionEnter
4.5 交互总结
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
检测两个普通碰撞体之间的碰撞,需要发力,才能发生碰撞。 不能与第一人称控制器发生碰撞。
分享到:
收藏