unity3d 触发器动画_unity3d 触发动画 - CSDN
  • bool IsHaveTargetEvent(GameObject go, string triggerName) { Animator animator = go.GetComponentInChildren(); Debug.Assert(animator != null, string.Format("{0} 缺少 Animator Com", go.
    bool IsHaveTargetEvent(GameObject go, string triggerName)
        {
            Animator animator = go.GetComponentInChildren<Animator>();
            Debug.Assert(animator != null, string.Format("{0} 缺少 Animator Com", go.name));
            if (animator == null)
            {
                return false;
            }
    
            UnityEditor.Animations.AnimatorController controller = animator.runtimeAnimatorController as UnityEditor.Animations.AnimatorController;
            Debug.Assert(controller != null, string.Format("{0} 缺少 animator controller", go.name));
            if (controller == null)
            {
                return false;
            }
    
            UnityEditor.Animations.AnimatorStateMachine baseStateMachine = controller.layers[0].stateMachine;
            foreach (UnityEditor.Animations.AnimatorStateTransition t in baseStateMachine.anyStateTransitions)
            {
                foreach (UnityEditor.Animations.AnimatorCondition c in t.conditions)
                {
                    if (triggerName == c.parameter)
                    {
                        AnimationClip clip = t.destinationState.motion as AnimationClip;
                        if (clip == null)
                        {
                            return false;
                        }
                        AnimationEvent[] events = clip.events;
                        bool isHaveEndEvent = false;
                        foreach (AnimationEvent ev in events)
                        {
                            string functionName = ev.functionName;
    
                            if (functionName == Const.EVENT_NAME)
                            {
                                string strPar = ev.stringParameter;
                                if (strPar == Const.EVENT_END_NAME)
                                {
                                    isHaveEndEvent = true;
                                }
                                
                            }
                        }
                        return isHaveEndEvent;
                    }
                }
            }
            return false;
        }

    展开全文
  • 相信大家在安装完Unity3D后做的第一件事情一定是浏览官方的示例项目《愤怒的机器人》,这个游戏在场景渲染及光照阴影特效等方面都有不错的表现。那么不知道大家还记不记得这样一个场景,当玩家操控我们的游戏角色...

           大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei

           相信大家在安装完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;
    	  }
    	}
    	
           我们在这里是通过改变一个bool型的标志变量来标记角色是否引起了触发,当引起了触发的时候执行开门的动画,退出除了触发的时候执行关门的动画。这一部分我们放在Update()方法里:

    	
    	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);
    	}
    	
    	
    }
    

            一起来看看效果演示吧:


             喜欢我的博客请记住我的名字:秦元培,我的博客地址是:blog.csdn.net/qinyuanpei
             转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/24198893


         

    展开全文
  • Unity3d脚本控制动画(开关门)代码
  • 一起来学习如何在Unity3D中实现基于Trigger的触发式动画



    相信大家在安装完Unity3D后做的第一件事情一定是浏览官方的示例项目《愤怒的机器人》,这个游戏在场景渲染及光照阴影特效等方面都有不错的表现。那么不知道大家还记不记得这样一个场景,当玩家操控我们的游戏角色——机器人时,当机器人靠近游戏场景中的门时,门会自动打开,而当机器人离开门时,门会自动关闭。那么,我们今天就来一起实现这样一个简单的功能。通过题目大家一定知道了这个功能的实现是基于Trigger的。Trigger在Unity3D中称为触发器,当一个碰撞器勾选了isTrigger选项后,即变成了触发器。触发器和碰撞器的区别在于碰撞器通过OnCollisionEnter/Stay/Exit()三个方法进行响应且会对参与到碰撞中的物体产生力的作用。而触发器则通过OnTriggerEnter/Stay/Exit()三个方法来响应且不会对参与到触发的物体产生力的作用。关于触发器和碰撞器的内容,大家可以参考这篇文章:http://game.ceeger.com/Components/class-BoxCollider.html

           好了,下面请大家跟随我一起来学习如何在Unity3D中实现基于Trigger的触发式动画,首先我们创建如下的场景:

            场景中的地面和墙体、门均有Cube构成,这里我们把地面、墙体的盒子碰撞器全部移除,避免它们对我们的程序产生干扰。首先我们编写两段脚本来控制门从左向右移动、从右向左移动的动画:

    1. //开门动画  
    2. private void OpenDoorAni()  
    3.        {  
    4.   if(transform.position.x<=1.8F)  
    5.   {  
    6.     transform.Translate(Vector3.right * Time.deltaTime * 1.5F);  
    7.   }  
    8.        }  
    9. //关门动画  
    10. private void CloseDoorAni()  
    11. {  
    12.   //等待5秒后再关门,避免角色与门发生碰撞  
    13.   StartCoroutine("Wait");  
    14.   if(transform.position.x>=0)  
    15.   {  
    16.     transform.Translate(Vector3.left * Time.deltaTime * 1.5F);  
    17.   }  
    18. }  

             代码基本上很容易理解,就是分别从左向右、从右向左移动门啦!接下来,我们给我们的角色加上一个球体碰撞器并勾选isTrigger选项,为什么选择球体碰撞器呢,因为这样角色进入触发和退出触发的时候,都是和门的盒子碰撞器相切的。在关门的时候延迟两秒是为了给玩家一个控制角色的反应时间,避免和门发生碰撞。这里要注意的是角色是带刚体的。

             好了,接下来我们编写触发这一块的代码:

    1. void OnTriggerEnter(Collider mCollider)  
    2. {  
    3.   Debug.Log(mCollider.gameObject.tag);  
    4.   if(mCollider.gameObject.tag=="Player")  
    5.   {  
    6.     Triggered=true;  
    7.   }  
    8. }  
    9.   
    10. void OnTriggerExit(Collider mCollider)  
    11. {  
    12.   if(mCollider.gameObject.tag=="Player")  
    13.   {  
    14.     Triggered=false;  
    15.   }  
    16. }  
           我们在这里是通过改变一个bool型的标志变量来标记角色是否引起了触发,当引起了触发的时候执行开门的动画,退出除了触发的时候执行关门的动画。这一部分我们放在Update()方法里:
    1. void Update ()   
    2. {  
    3.   if(Triggered)  
    4.   {  
    5.     OpenDoorAni();  
    6.   }else if(!Triggered)  
    7.   {  
    8.     CloseDoorAni();  
    9.   }  
    10. }  

          最后给出全部代码:
    1. using UnityEngine;  
    2. using System.Collections;  
    3.   
    4. public class AniScripts : MonoBehaviour {  
    5.       
    6.     //定义门的移动速度  
    7.     public float mSpeed=1.5F;  
    8.     //定义门的标志变量  
    9.     private bool Triggered=false;  
    10.       
    11.     void Update ()   
    12.     {  
    13.       if(Triggered)  
    14.       {  
    15.         OpenDoorAni();  
    16.       }else if(!Triggered)  
    17.       {  
    18.         CloseDoorAni();  
    19.       }  
    20.     }  
    21.       
    22.     //开门动画  
    23.     private void OpenDoorAni()  
    24.     {  
    25.       if(transform.position.x<=1.8F)  
    26.       {  
    27.         transform.Translate(Vector3.right * Time.deltaTime * 1.5F);  
    28.       }  
    29.     }  
    30.     //关门动画  
    31.     private void CloseDoorAni()  
    32.     {  
    33.       //等待5秒后再关门,避免角色与门发生碰撞  
    34.       StartCoroutine("Wait");  
    35.       if(transform.position.x>=0)  
    36.       {  
    37.         transform.Translate(Vector3.left * Time.deltaTime * 1.5F);  
    38.       }  
    39.     }  
    40.       
    41.     void OnTriggerEnter(Collider mCollider)  
    42.     {  
    43.       Debug.Log(mCollider.gameObject.tag);  
    44.       if(mCollider.gameObject.tag=="Player")  
    45.       {  
    46.         Triggered=true;  
    47.       }  
    48.     }  
    49.       
    50.     void OnTriggerExit(Collider mCollider)  
    51.     {  
    52.       if(mCollider.gameObject.tag=="Player")  
    53.       {  
    54.         Triggered=false;  
    55.       }  
    56.     }  
    57.       
    58.       
    59.     IEnumerator Wait()  
    60.     {  
    61.         //等待5秒在执行  
    62.         yield return new WaitForSeconds(5);  
    63.     }  
    64.       
    65.       
    66. }  

            一起来看看效果演示吧:

    展开全文
  • using System.Collections; using System.Collections.Generic; using UnityEngine; public class OpenCloseDoor : MonoBehaviour { private Transform m_transform;... // Use this for initialization ...
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class OpenCloseDoor : MonoBehaviour {
    
        private Transform m_transform;
    
    	// Use this for initialization
    	void Start () {
    		m_transform=GameObject.Find("DoorFather").GetComponent<Transform>();
    	}
    	
    	// Update is called once per frame
    	void Update () {
    		
    	}
    
        void OnTriggerEnter(Collider other) {
            if (other.gameObject.name == "Player") {
                m_transform.Rotate(Vector3.up * 100);
            }
        }
    
        void OnTriggerExit(Collider other) {
            if (other.gameObject.name == "Player") {
                m_transform.Rotate(Vector3.down * 100);
            }
        }
    }
    

    展开全文
  • 在游戏制作中触发器的使用非常的方便也非常实用。这一张我们简单介绍一下如何使用一个简单的触发器来实现自动开门关门的效果。 首先确保你已经对门进行了动画的设置。 具体流程如下。 选择Window->Animation打开动画...
  • 翻译自DT的经典教程:《Introduction to Unity》。 在游戏制作中触发器的使用非常的方便也非常实用。这一张我们简单介绍一下如何使用一个简单的触发器来实现自动开门关门的效果。 首先确保你已经对门进行了...
  • 在游戏制作中触发器的使用很的方便也很有用。这一张我们简介一下怎样使用一个简单的触发器来实现自己主动开门关门的效果。 首先确保你已经对门进行了动画的设置。 详细流程例如以下。 选择Window-&gt;...
  • unity中,模型的行为通常是与动画同时发生的,但是在处理过程中,我们又需要把播放动画与行为触发分开实现,来达到代码的简介与功能的划分,这时候就要用到事件与委托。在这里我们用一个AnimationEventBehaviour工具...
  • 在学习unity3d的过程中遇到一个问题,就是在任务死亡的时候人物会一直重复死亡的动作,在设置animations的之后发现一起都没问题,触发器也是使用的trigger,一起都没问题,一直没找到解决的办法,终于在一片博客的帮助下...
  • animator动画状态机模式(传送门)和animation模式下加入事件 1、animator模式 首先在模型上挂个脚本 代码如下public class charEvents : MonoBehaviour {public void ActionEvent1(string _arg1) { Debug.LogFo
  • 新建一个Cube物体和一个脚本Cube,将Cube脚本挂到Cube物体上,代码如下:[csharp] view plain copyusing UnityEngine; using System.Collections; public class Cube : MonoBehaviour { void OnTouched...
  • 当使用具体模型时,可以使模型动画来触发方法,即帧事件,(类似碰撞器,触发器的触发方法)。比如说一个角色的攻击动画,可以通过播放动画到某一帧来执行某个方法 通过图添帧事件 点击人物,然后在window找到...
  • Unity 3d 简单动画

    2020-04-26 12:05:50
    创建动画 重要提示: 这三个键一定不要乱点,不然会报错,而且解决不了,只能重做 错误:“AnimationEvent has no function name specified"? 在Animation 中定义了一个事件,而没有给事件添加对应的...
  • Unity中使用Animator和trigger参数做简单的UI动画
  • 当使用具体模型时,可以使模型动画来触发方法,即帧事件,(类似碰撞器,触发器的触发方法)。比如说一个角色的攻击动画,可以通过播放动画到某一帧来执行某个方法。 另外新动画也可以使用Animation做帧事件 帧...
  • 肯定都是站立不动的状态,然而事实上,玩家不可能和木头人一样完全静止,这样显得非常不真实,给玩家带来的体验当然也会很差,所以基本上所有有角色的游戏(纯2D游戏除外),角色的站立状态也都是有专门的动画的。...
  • 摘要:经过两星期的动画的学习,这一次我们要完成一个有动画的小游戏---智能巡逻兵,并且必须使用订阅与发布模式传消息,其中巡逻兵和场景可以由工厂生成。并且最好能够将我们之前学习的模式一起整合一下,完成一个...
  • Unity3D常见面试题

    2017-08-11 20:20:00
    Unity3D常见面试题
  • 游戏里面的跳跃和二段跳真的不是很难,尤其是Unity3D直接提供力量模拟引擎更是可以用极其简短的代码完成这一切。 下面的程序将加一个对鼠标左键点击的监听,实现两个球的跳跃与二段跳的功能,主要思想还是处理球在...
1 2 3 4 5 ... 20
收藏数 902
精华内容 360
关键字:

unity3d 触发器动画