2014-04-20 22:32:23 qinyuanpei 阅读数 11786

       大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是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


     

2019-09-28 20:19:09 Abit_Go 阅读数 47

在学习unity3d的过程中遇到一个问题,就是在任务死亡的时候人物会一直重复死亡的动作,在设置animations的之后发现一起都没问题,触发器也是使用的trigger,一起都没问题,一直没找到解决的办法,终于在一片博客的帮助下解决了:在siki的网站上看见的

只需要将下面这个勾选去掉即可

2014-03-07 16:53:31 abcdtty 阅读数 2127


前几天在使用Unity4的新版动画系统Animator时发现了一个问题, 就是Animator里同一个动画状态无法直接切换.
比如你有一个动画A, 然后再Animator面板中创建了一个动画状态SA(里面包含A), 接着播放SA, 在SA还没有播放完成时, 又执行了一次播放SA, 
此时一般认为A动画会被重新播放, 但实际却没有, 再次播放A动画的命令被直接无视了... 

但是如果你再建立动画状态S2A(里面包含A), 在SA没有播放完成时, 播放S2A, 则A动画立即就重新播放了...


所以想要立即重新播放同一个动画的情况下..只有建两个动画状态, 然后来回切换.

2014-04-10 18:33:52 u011714480 阅读数 3550



动画状态 (Animation State)
动画状态 (Animation State) 是 动画状态机 (Animation State Machine)的基本构造块。每个状态包含将在角色处于该状态时播放的单独动画序列(或混合树 (blend tree))。游戏中的事件触发状态转换时,角色会保留为新状态,该状态的动画序列随后会接管播放。

在动画器控制器 (Animator Controller) 中选择状态时,会在检视器 (Inspector) 中看到该状态的属性:

属性: 功能:
速度 (Speed) 动画的默认速度
运动 (Motion) 分配给此状态的动画片段
脚 IK (Foot IK) 是否应对此状态考虑“脚 IK”(Foot IK)
转换 (Transitions) 源自此状态的转换的列表
默认状态(以棕色显示)是第一次激活时计算机所处的状态。必要时,可以通过右键单击另一个状态并从上下文菜单中选择设为默认 (Set As Default) 来更改默认状态。每个转换上的独奏 (solo) 和静音 (mute) 复选框用于控制动画预览行为 — 有关更多详细信息,请参阅此页面。


可以通过在动画器控制器窗口 (Animator Controller Window) 中右键单击空白空间并从上下文菜单中选择 创建状态 (Create State)->空 (Empty) ,来添加新状态。或者,可以将一个动画拖动到动画器控制器窗口 (Animator Controller Window) 中以创建包含该动画的状态。(请注意,只能将 Mecanim 动画拖动到控制器中 - 非 Mecanim 动画会被拒绝。)状态还可以包含混合树 (Blend Tree)。


任意状态 (Any State)
任意状态 (Any State) 是始终存在的特殊状态。该状态针对您要转变为特定状态(无论您当前处于何状态)的情况而存在。这是将相同向外转换添加到机器中所有状态的快速方法。请注意,任意状态 (Any State) 的特殊含义意味着它不能是转换的结束点(即,跳转到“任意状态”不能用作挑选下一次进入的随机状态的方式)。


本文章由游戏蛮牛unity3d视频教程整理推荐
unity3d中文手册  

2015-02-09 23:16:03 book_longssl 阅读数 4967

在游戏制作中触发器的使用非常的方便也非常实用。这一张我们简单介绍一下如何使用一个简单的触发器来实现自动开门关门的效果。
首先确保你已经对门进行了动画的设置。
具体流程如下。
选择Window->Animation打开动画窗口,选中需要添加动画的门之后点击红色按钮创建新动画。


选中一个需要添加动画的要素之后(比如Postion.x),点击添加关键帧按钮:


拖动时间轴,在动画终点的位置放手:


在场景中拖动那个门到想要停止的位置,创建动画终点的关键帧:


点击Animation面板上的播放键,可以预览一下门开动的效果。
至此,简单的动画就算是制作完毕了。
接下来就是触发器的制作。
先添加一个GameObject->CreaateOther->Sphere球形的物体,用它来作触发器。


创建完毕之后,去掉勾选的MeshRender使得球体变成透明的:


给这个球体添加一段Unity自带的脚本,使其具备触发器的功能:


选择触发器的Target对象:


将其激活的事件设置为Animate:


但是此时的球体是碰撞体,无法冲入实现触发器的功能,所以需要勾选Is Trigger选项:


这个时候再次运行,便会发现门在我们接近的时候就会自动打开了

unity3d 面试题

阅读数 5068

没有更多推荐了,返回首页