【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 1683|回复: 0

6-3 Single Doors 单开门的逻辑

[复制链接]
发表于 2013-10-2 08:26:27 | 显示全部楼层 |阅读模式
在游戏中,单开门的逻辑
DoorAnimation
C#
  1. using UnityEngine;
  2. using System.Collections;

  3. public class DoorAnimation : MonoBehaviour {
  4.         public bool requireKey;                     // 是否需要开门钥匙.
  5.         public AudioClip doorSwishClip;             // 开关门的声音.
  6.         public AudioClip accessDeniedClip;          // 没带钥匙开门发出的错误提示音.
  7.        
  8.        
  9.         private Animator anim;                      // 动画控制器变量.
  10.         private HashIDs hash;                       // 哈希表变量
  11.         private GameObject player;                  // 玩家变量.
  12.         private PlayerInventory playerInventory;    // 玩家变量.
  13.         private int count;                          // 开门人数的计数器.

  14.         // Use this for initialization
  15.         void Awake ()
  16.         {
  17.                 // 初始化变量.
  18.                 anim = GetComponent<Animator>();
  19.                 hash = GameObject.FindGameObjectWithTag(Tags.gameController).GetComponent<HashIDs>();
  20.                 player = GameObject.FindGameObjectWithTag(Tags.player);
  21.                 playerInventory = player.GetComponent<PlayerInventory>();
  22.         }

  23.         // 进入触发区域
  24.         void OnTriggerEnter (Collider other)
  25.         {
  26.                 // 加入进入这个触发区域的是player...
  27.                 if(other.gameObject == player)
  28.                 {
  29.                         // ... 如果这个门是需要钥匙开启的...
  30.                         if(requireKey)
  31.                         {
  32.                                 // ... 判断玩家身上是否有钥匙...
  33.                                 if(playerInventory.hasKey)
  34.                                         // ... 给碰撞区域的计数器+1.
  35.                                         count++;
  36.                                 else
  37.                                 {
  38.                                         // 如果玩家身上没有带钥匙,则播放失败提示音.
  39.                                         audio.clip = accessDeniedClip;
  40.                                         audio.Play();
  41.                                 }
  42.                         }
  43.                         else
  44.                                 // 如果这个门不需要Key, 计数器+1.
  45.                         {
  46.                                 count++;
  47.                         }

  48.                         
  49.                 }
  50.                 // 如果进入区域的是敌人...
  51.                 else if(other.gameObject.tag == DoneTags.enemy)
  52.                 {
  53.                         // ... 如果进入区域的是一个胶囊碰撞体...
  54.                         if(other is CapsuleCollider)
  55.                                 // ... 给计数器+1.
  56.                                 count++;
  57.                 }
  58.         }

  59.         void Update ()
  60.         {
  61.                 // 设置动画控制器Open变量为true,则动画控制器播放开开门动画.
  62.                 anim.SetBool(hash.openBool,count > 0);
  63.                
  64.                 // 如果门处于开门或者关门的动画中,并且开关门声音没有播放...
  65.                 if(anim.IsInTransition(0) && !audio.isPlaying)
  66.                 {
  67.                         // ... 播放开门关门的声音.
  68.                         audio.clip = doorSwishClip;
  69.                         audio.Play();
  70.                 }
  71.         }

  72.         // 当离开触发区
  73.         void OnTriggerExit (Collider other)
  74.         {
  75.                 // 判断玩家或者敌人离开了触发区域...
  76.                 if(other.gameObject == player || (other.gameObject.tag == Tags.enemy && other is CapsuleCollider))
  77.                         // 计数器减去离开触发区域相应的个数.
  78.                         count = Mathf.Max(0, count-1);
  79.         }
  80. }
复制代码
JS
  1. #pragma strict

  2. public var requireKey : boolean;                    // Whether or not a key is required.
  3. public var doorSwishClip : AudioClip;               // Clip to play when the doors open or close.
  4. public var accessDeniedClip : AudioClip;            // Clip to play when the player doesn't have the key for the door.


  5. private var anim : Animator;                        // Reference to the animator component.
  6. private var hash : HashIDs;                     // Reference to the HashIDs script.
  7. private var player : GameObject;                    // Reference to the player GameObject.
  8. private var playerInventory : PlayerInventory;  // Reference to the PlayerInventory script.
  9. private var count : int;                            // The number of colliders present that should open the doors.


  10. function Awake ()
  11. {
  12.     // Setting up the references.
  13.     anim = GetComponent(Animator);
  14.     hash = GameObject.FindGameObjectWithTag(Tags.gameController).GetComponent(HashIDs);
  15.     player = GameObject.FindGameObjectWithTag(Tags.player);
  16.     playerInventory = player.GetComponent(PlayerInventory);
  17. }


  18. function OnTriggerEnter (other : Collider)
  19. {
  20.     // If the triggering gameobject is the player...
  21.     if(other.gameObject == player)
  22.     {
  23.         // ... if this door requires a key...
  24.         if(requireKey)
  25.         {
  26.             // ... if the player has the key...
  27.             if(playerInventory.hasKey)
  28.                 // ... increase the count of triggering objects.
  29.                 count++;
  30.             else
  31.             {
  32.                 // If the player doesn't have the key play the access denied audio clip.
  33.                 audio.clip = accessDeniedClip;
  34.                 audio.Play();
  35.             }
  36.         }
  37.         else
  38.             // If the door doesn't require a key, increase the count of triggering objects.
  39.             count++;
  40.     }
  41.     // If the triggering gameobject is an enemy...
  42.     else if(other.gameObject.tag == Tags.enemy)
  43.     {
  44.         // ... if the triggering collider is a capsule collider...
  45.         if(typeof(other) == CapsuleCollider)
  46.             // ... increase the count of triggering objects.
  47.             count++;
  48.     }
  49. }


  50. function OnTriggerExit (other : Collider)
  51. {
  52.     // If the leaving gameobject is the player or an enemy and the collider is a capsule collider...
  53.     if(other.gameObject == player || (other.gameObject.tag == Tags.enemy && typeof(other) == CapsuleCollider))
  54.         // decrease the count of triggering objects.
  55.         count = Mathf.Max(0, count-1);
  56. }


  57. function Update ()
  58. {
  59.     // Set the open parameter.
  60.     anim.SetBool(hash.openBool,count > 0);
  61.    
  62.     // If the door is opening or closing...
  63.     if(anim.IsInTransition(0) && !audio.isPlaying)
  64.     {
  65.         // ... play the door swish audio clip.
  66.         audio.clip = doorSwishClip;
  67.         audio.Play();
  68.     }
  69. }
复制代码

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-11-23 21:41

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表