Unity3D游戏开发之基于Trigger的触发式动画设计
来源:互联网 发布:电视盒子刷入linux 编辑:程序博客网 时间:2024/05/19 05:03
相信大家在安装完Unity3D后做的第一件事情一定是浏览官方的示例项目《愤怒的机器人》,这个游戏在场景渲染及光照阴影特效等方面都有不错的表现。那么不知道大家还记不记得这样一个场景,当玩家操控我们的游戏角色——机器人时,当机器人靠近游戏场景中的门时,门会自动打开,而当机器人离开门时,门会自动关闭。那么,我们今天就来一起实现这样一个简单的功能。通过题目大家一定知道了这个功能的实现是基于Trigger的。Trigger在Unity3D中称为触发器,当一个碰撞器勾选了isTrigger选项后,即变成了触发器。触发器和碰撞器的区别在于碰撞器通过OnCollisionEnter/Stay/Exit()三个方法进行响应且会对参与到碰撞中的物体产生力的作用。而触发器则通过OnTriggerEnter/Stay/Exit()三个方法来响应且不会对参与到触发的物体产生力的作用。关于触发器和碰撞器的内容,大家可以参考这篇文章:http://game.ceeger.com/Components/class-BoxCollider.html
好了,下面请大家跟随我一起来学习如何在Unity3D中实现基于Trigger的触发式动画,首先我们创建如下的场景:
场景中的地面和墙体、门均有Cube构成,这里我们把地面、墙体的盒子碰撞器全部移除,避免它们对我们的程序产生干扰。首先我们编写两段脚本来控制门从左向右移动、从右向左移动的动画:
- //开门动画
- private void OpenDoorAni()
- {
- if(transform.position.x<=1.8F)
- {
- transform.Translate(Vector3.right * Time.deltaTime * 1.5F);
- }
- }
- //关门动画
- private void CloseDoorAni()
- {
- //等待5秒后再关门,避免角色与门发生碰撞
- StartCoroutine("Wait");
- if(transform.position.x>=0)
- {
- transform.Translate(Vector3.left * Time.deltaTime * 1.5F);
- }
- }
代码基本上很容易理解,就是分别从左向右、从右向左移动门啦!接下来,我们给我们的角色加上一个球体碰撞器并勾选isTrigger选项,为什么选择球体碰撞器呢,因为这样角色进入触发和退出触发的时候,都是和门的盒子碰撞器相切的。在关门的时候延迟两秒是为了给玩家一个控制角色的反应时间,避免和门发生碰撞。这里要注意的是角色是带刚体的。
好了,接下来我们编写触发这一块的代码:
- void OnTriggerEnter(Collider mCollider)
- {
- Debug.Log(mCollider.gameObject.tag);
- if(mCollider.gameObject.tag=="Player")
- {
- Triggered=true;
- }
- }
- void OnTriggerExit(Collider mCollider)
- {
- if(mCollider.gameObject.tag=="Player")
- {
- Triggered=false;
- }
- }
- void Update ()
- {
- if(Triggered)
- {
- OpenDoorAni();
- }else if(!Triggered)
- {
- CloseDoorAni();
- }
- }
最后给出全部代码:
- using UnityEngine;
- using System.Collections;
- public class AniScripts : MonoBehaviour {
- //定义门的移动速度
- public float mSpeed=1.5F;
- //定义门的标志变量
- private bool Triggered=false;
- void Update ()
- {
- if(Triggered)
- {
- OpenDoorAni();
- }else if(!Triggered)
- {
- CloseDoorAni();
- }
- }
- //开门动画
- private void OpenDoorAni()
- {
- if(transform.position.x<=1.8F)
- {
- transform.Translate(Vector3.right * Time.deltaTime * 1.5F);
- }
- }
- //关门动画
- private void CloseDoorAni()
- {
- //等待5秒后再关门,避免角色与门发生碰撞
- StartCoroutine("Wait");
- if(transform.position.x>=0)
- {
- transform.Translate(Vector3.left * Time.deltaTime * 1.5F);
- }
- }
- void OnTriggerEnter(Collider mCollider)
- {
- Debug.Log(mCollider.gameObject.tag);
- if(mCollider.gameObject.tag=="Player")
- {
- Triggered=true;
- }
- }
- void OnTriggerExit(Collider mCollider)
- {
- if(mCollider.gameObject.tag=="Player")
- {
- Triggered=false;
- }
- }
- IEnumerator Wait()
- {
- //等待5秒在执行
- yield return new WaitForSeconds(5);
- }
- }
一起来看看效果演示吧:
- Unity3D游戏开发之基于Trigger的触发式动画设计
- [Unity3D]Unity3D游戏开发之基于Trigger的触发式动画设计
- 基于Unity3D的打砖块游戏开发
- [Unity3D]Unity3D游戏开发之基于Terrain Toolkit实现地形的制作
- Unity3D游戏开发之基于Terrain Toolkit实现地形的制作
- Unity3D游戏开发之愤怒的小球
- Unity3D游戏开发之愤怒的小球
- Unity3D游戏开发之GUI的使用
- 【UNITY3D 游戏开发之八】Unity编译到iPhone运行 Collider 无法正常触发事件解决方案
- 【UNITY3D 游戏开发之八】Unity编译到iPhone运行 Collider 无法正常触发事件解决方案
- Unity3D游戏开发之开发游戏带来的问题
- [Unity3D]Unity3D游戏开发之再话小地图的实现
- [Unity3D]Unity3D游戏开发之刀光剑影特效的实现
- [Unity3D]Unity3D游戏开发之换装系统的实现
- [Unity3D]Unity3D游戏开发之《愤怒的小鸟》弹弓实现
- [Unity3D]Unity3D游戏开发之《愤怒的小鸟》弹弓实现
- [Unity3D]Unity3D游戏开发之Logo渐入渐出效果的实现
- Unity3D 游戏引擎之详解游戏开发音频的播放
- Intent中显示意图和隐式意图的用法
- Android 快速开发系列 打造万能的ListView GridView 适配器
- 关于cocos2d-x
- boost asio
- Linux下安装配置JDK和tomcat
- Unity3D游戏开发之基于Trigger的触发式动画设计
- SPRING指定加载本地xsd约束
- 分布式系统理解
- 【ACdream】1157 Segments cdq分治
- Building Your Project with Gradle
- 对MediaPlayer,简易的音乐播放器
- BZOJ 3629 JLOI2014 聪明的燕姿 约数和+DFS
- YARN AM与RM通信
- Hibernate内部缓存分析