delay执行 unity3d_unity delay - CSDN
  • 这里只给出了两种方法,以后继续补充。 【一】协程 例子: void Start()  {  StartCoroutine(PlayerAttack());  } IEnumerator PlayerAttack()  {  yield return new WaitForSeconds(3.0f... 

    这里只给出了两种方法,以后继续补充。


    【一】协程

    例子:

    void Start()
        {
            StartCoroutine(PlayerAttack());

        }


    IEnumerator PlayerAttack()
        {
            yield return new WaitForSeconds(3.0f);
            Debug.Log("After 3s");
        }


    3秒后显示“After 3s”信息。


    注意:协程有些复杂,例如上面的程序修改成下面的样子后:

    void Start()
        {
            StartCoroutine(PlayerAttack());
            Debug.Log("After PlayerAttack");
        }


    IEnumerator PlayerAttack()
        {
            yield return new WaitForSeconds(3.0f);
            Debug.Log("After 3s");
        }


    在显示“After 3s”信息前,会先显示“After PlayerAttack”信息。



    【二】Invoke()方法

    例子:

    void Start()
        {
            Invoke("ShowWord", 3f);
        }


        public void ShowWord()
        {
            Debug.Log("I love the bird");
        }


    3秒后调用ShowWord()方法显示“I love the bird”信息。


    注意:

    Invoke()是一种委托机制,网上说有如下3点需要注意的事项:

    1.它应该在脚本的生命周期里的Start()、Update()、OnGUI()、FIxedUpdate()、LateUpdate()中被调用;

    2.Invoke()方法里不能接受含有参数的方法;

    3.在 Time.ScaleTime = 0; 时,Invoke() 方法无效,因为它不会被调用。


    对于第一点不是很了解,因为如下程序是可以按照预料去执行的:

    void Start()
        {
            CallYou();
        }

        public void CallYou()
        {
            Invoke("ShowWord", 3f);
        }


        public void ShowWord()
        {
            Debug.Log("I love the bird");
        }


    上面程序中没有直接在 Start() 方法中调用 Invoke() 方法,不过还是正常执行,说明了这样使用 Invoke() 方法相当于直接在 Start() 方法中调用。

    希望有谁能解释一下第一点是什么意思。


    展开全文
  •  在前面的文章中,我们分别实现了一个自定义的角色控制器《[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果》和角色死亡的效果《[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色死亡效果实现》。今天我们继续来做...

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

             在前面的文章中,我们分别实现了一个自定义的角色控制器《[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果》和角色死亡的效果《[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色死亡效果实现》。今天我们继续来做点和仙剑相关的东西,首先我们来看一副图:


             这幅图呢,是仙剑奇侠传的第一个迷宫场景——仙灵岛的莲花池。男主角李逍遥为替婶婶求药独闯仙灵岛,在经历了前面的小草妖战斗后,李逍遥就来到了 莲花池,这个迷宫的解法很简单,乘坐莲花池中的芦苇垫到不同的地方,然后用破天锤打碎五座阿修罗像,通往仙灵岛的通路就会被打开,就是在仙灵岛李逍遥邂逅了正在沐浴的赵灵儿,仙剑奇侠传的故事从此展开。好了,故事先说到这里,我们来看这里很重要的一个信息:李逍遥踩着芦苇垫到达不同的地方,然后用破天锤打碎石像开启机关。我们把最终要的东西提取出来的话就是我们可以踩着芦苇垫子到不同的地方去。好,我们今天就来实现一个简化的"仙灵岛"吧!那么怎么做呢?不知道大家还记不记得我在《[Unity3D]Unity3D游戏开发之基于ITween实现寻路功能》这篇文章里提到过的寻路方法,在这篇文章中,我们最终实现的效果是这样的:


            现在呢,让我们把莲花池里的构件做一下抽象:每一个 石柱可以看做是一个寻路节点,芦苇垫子可以看做是绑定了寻路组件的一个GameObject。唯一的区别就在于这里的芦苇垫子是需要我们的角色站在上面才能让它运动的,而我们在这篇文章里的游戏体是自己运动的。好,现在我们开始来实现这个功能吧。我们先创建如下图所示的场景:


           我们在水中布置了8个石柱,两个芦苇垫子,当游戏开始时,玩家控制角色走上芦苇垫子时,芦苇垫子将按照事先设定的路线,将角色送达最后一个石柱位置,此时,玩家可以控制角色到达对岸。当玩家再次踏上芦苇垫子时,芦苇垫子会将角色送回起点位置。当芦苇垫子处于移动状态中时,角色可以向四个方向旋转,活动范围仅限于芦苇垫子上。好,交待清楚了场景,我们下面来讲解原理:

           1、角色控制

                 采用在《[Unity3D]Unity3D游戏开发之仿仙剑奇侠传角色控制效果》中实现的角色控制器来控制角色的行为。

           2、寻路的实现

                 采用在《[Unity3D]Unity3D游戏开发之基于ITween实现寻路功能》中实现的寻路组件作为基础脚本,本节在此基础上做扩充和完善,保证角色可以自由的移动

           基于以上两个原理,我们下面来编写今天的脚本:

    using UnityEngine;
    using System.Collections;
    
    public class TransportScript : MonoBehaviour {
    	
    	//寻路组件节点
    	public Transform[] mPaths;
    	//芦苇垫传送器
    	private Transform mTransportor;
    	//被传送的角色
    	public Transform mTransportPlayer;
    	
    	//起点
    	Vector3 StartPoint=new Vector3(0F,0.5F,-13F);
    	//终点
    	Vector3 EndPoint=new Vector3(0F,0.5F,10F);
    	
    	//定义移动的方向类型:从起点到终点为0,从终点到起点为1
    	private int MoveType=0;
    	//定义移动状态的标志变量
    	private bool isMoving=false;
    	
    	//存储寻路组件设置的哈希表
    	private Hashtable args=new Hashtable();
    	
    	void Start () 
    	{
    		//获取传送器
    		mTransportor=this.transform;
    
    		//初始化寻路插件
    	    Hashtable args = new Hashtable();
    	    //设置路径的点
    		args.Add("path",mPaths);
    		//设置类型为线性,线性效果会好一些。
    		args.Add("easeType", iTween.EaseType.linear);
    		//设置寻路的速度
    		args.Add("speed",2.5f);
    	    //移动的整体时间。如果与speed共存那么优先speed
    		args.Add("time",10f);
    		//是否先从原始位置走到路径中第一个点的位置
    		args.Add("movetopath",true);
    		//延迟执行时间
    		args.Add("delay", 0.1f);
    		//移动的过程中面朝一个点
    		args.Add("looktarget",Vector3.up);
    		//三个循环类型 none loop pingPong (一般 循环 来回)	
    		args.Add("loopType", "pingPong");
    		//是否让模型始终面朝当面目标的方向
    		//如果你发现你的模型在寻路的时候时钟都是一个方向那么一定要打开这个
    		args.Add("orienttopath",true);
    	
    		iTween.MoveTo(gameObject,args);
    		iTween.Pause();
    	}
    	
    	void  Update()
    	{
    	   //如果当前处于停止状态则暂停动画
    	   if(isMoving==false)
    	   {
    		  iTween.Pause();
    	   }
    
    	   //从起点到终点的控制
    	   if(MoveType==0 && mTransportor.position!=EndPoint && isMoving==true)
    	   {
    		  //未到达终点则继续运动
    	      mTransportPlayer.position=mTransportor.position;
    	   }else if(MoveType==0 && mTransportor.position==EndPoint)
    	   {
    		  //到达终点则暂停运动
    		  iTween.Pause();
    		  isMoving=false;
    		  MoveType=1;
    	   }
    		
    	   //从终点到起点的控制
    	   if(MoveType==1 && mTransportor.position!=StartPoint && isMoving==true)
    	   {
    		  //未到达终点则继续运动
    	      mTransportPlayer.position=mTransportor.position;
    	   }else if(MoveType==1 && mTransportor.position==StartPoint)
    	   {
    		  //到达终点则暂停运动
    		  iTween.Pause();
    	      isMoving=false;
    		  MoveType=0;
    	   }
    	   
    	}
    	
    	//当角色走上芦苇垫的时候开始移动动画
    	void OnTriggerEnter(Collider mCollider)
    	{
    		if(mCollider.gameObject.name=="Samuzai")
    		{
    		   
    		   if(isMoving==false)
    		   {
    			  isMoving=true;
    	          iTween.Resume();
    		   }
    		}
        }
    }
    

            在上面的代码中,我们需要把握以下几点:

            1、在Start()方法中,我们主要完成的是寻路组件的初始化,这里我们将寻路动画设置为来回,然后通过Pause()、Resume()方法两个方法来控制动画的播放,因为iTween没有提供在Update()中实现动画播放的方法,iTween只支持部分方法在Update()方法中使用,具体的大家可以自己去了解iTween的API文档。

            2、我们主要通过isMoving标志来标记当前的状态,使用OnTriggerEnter()方法来判断角色是否走上了芦苇垫子,当角色走上芦苇垫子上时,就开始播放寻路动画。当到达起点/终点时,寻路动画即停止。当角色再次走上芦苇垫子时,再次开始寻路动画。

           3、我们再Update()方法中通过改变角色的位置实现了角色和芦苇垫子的同步移动,当到达起点/终点时,寻路动画即停止,直到下一次被触发。

           4、触发与碰撞的区别在于触发不会产生力的作用,可以通过OnTriggerEnter/OnTriggerStay/OnTriggerExit方法分别监听触发开始、触发中、触发结束。要使用Trigger需要勾选碰撞器的isTrigger选项。具体的区别我会在后面的文章中为大家做讲解。

          

           这篇文章中用到的东西就是这么多,主要的难点是寻路动画的控制,由于官方没有提供有关的方法,所以我们只能采用Pause()、Resume()方法来控制角色的动画。最后我们来一起看看实现的效果吧,是不是有仙灵到的感觉呢?呵呵

          



          最后奉上几个民间的同人游戏演示:

          1、UDK制作的仙剑一3D版仙灵岛场景

          2、U3D制作的仙剑五前传同人演示1

                U3D制作的仙剑五前传同人演示2

          每次看到这里,内心都会充满一种希望,希望在有生之年玩到更多的仙剑,踏歌长行、梦想永续!继续努力吧!  

          喜欢我的博客请记住我的名字:秦元培,我的博客地址是:blog.csdn.net/qinyuanpei

          转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/24038749


    展开全文
  • Unity3D开发之延迟函数

    2018-04-19 10:23:44
    下面说下,项目中,我们经常会遇到一些要求延迟一两秒后执行某个函数的需求。通常MonoBehaviour提供的Invoke方法可以满足大部分需求,但是缺陷就是不能给含有参数的函数传参。而且如果逻辑很多的脚本中有十多个延迟...

        这个东西是我在16年的时候记录在新浪博客上的,后来弃用新浪了。原因很简单,新浪编辑器界面格式我不喜欢。哈哈。。下面说下,项目中,我们经常会遇到一些要求延迟一两秒后执行某个函数的需求。通常MonoBehaviour提供的Invoke方法可以满足大部分需求,但是缺陷就是不能给含有参数的函数传参。而且如果逻辑很多的脚本中有十多个延迟函数的需求,我们要写十多个函数来被调用,显得脚本很臃肿。所以,这就需要我们自己去重写封装了。下面就记录下我们可以用的几种延迟方法。

    一.利用协程

        unity支持协程,并且提供了yield return new WaitForSeconds( t )这个Api,很方便我们去设置时间延迟。所以代码如下:

      public static IEnumerator DelayFuc(Action action,float delaySeconds)
      {
            yield return new WaitForSeconds (delaySeconds);
            action ();
       }

    我们将上述方法写入到一个静态工具类里供我们全局调用。调用代码如下:

    StartCoroutine (Globle.DelayFuc(()=>{//do something;},delaySeconds));
    我们可以在拉姆达表达式内随意添加我们要添加的事件,而且代码整体不臃肿,结构紧凑。非常方便。

    二.Invoke

        MonoBehaviour给我们提供了两个静态延迟方法。Invoke和InvokeRepeating.

    第一个参数MethodName:被调用的方法名字  time:time秒后被调用
    public method Invoke(methodName: string, time: float): void;
    methodName:方法名  time:方法在time秒后被调用 repeatRate: 被调用后每隔repeatRate秒的频率循环调用
    public method InvokeRepeating(methodName: string, time: float, repeatRate: float): void;

    三.线程

        其实第三种方法和第一种方法差不多,开一个线程在里面做计时功能。达到设定值改变一个设定的Bool值,然后在Update里写一个判断,有点麻烦,而且线程里不支持调用unity组件相关的API,所以不是很推荐。

    以上就是我对于延迟函数的总结,希望对你有帮助!

    展开全文
  • Unity3D中的Coroutine详解

    2016-05-06 11:16:16
    Unity中的Coroutine原理猜测:虚拟机分段执行机制, 同类型嵌套用栈存放实现串行执行. Unity中使用yield Coroutine需要注意的问题

    本文太乱,推荐frankjfwang的:全面解析Coroutine技术

    Unity中的coroutine是通过yield expression;来实现的。官方脚本中到处会看到这样的代码。

    疑问:

    yield是什么?

    Coroutine是什么?

    unity的coroutine程序执行流程怎么那么奇怪?

    unity中的coroutine原理是什么,怎么实现的?

    使用unity的coroutine需要注意什么问题?


    一、yield的在几种语言中的程序执行特性

         Lua中的yield是使得协同函数运行->挂起并且传递参数给resume。resume使得协同函数挂起->运行并且传递参数给协同函数。

         C#中yield return/break是用于函数查询集合生成器里面的值(类似迭代)返回,并记录当前现场,下次查询时从上一次记录的yield现场处,继续往下执行,直到继续往下执行没有了,那么退出这段yield的逻辑。yield break会终止掉yield迭代逻辑并跳出。
    YieldImplementation:
       1).Caller callsfunction
       2).Caller requestsitem 按需请求一个元素
       3).Next itemreturned 返回请求的元素
       4).Goto step #2

        Python中的yield expression, 有yield的函数就变成了一个生成器,调用该函数返回的是迭代器对象,用迭代器对象调用next方法(或者循环中会自动调用next方法),才开始执行函数,执行到yield expression处则中断,返回迭代器当前的值,并保留现场,下次调用next则从现场处开始执行,迭代完了就停止了。可以看出Python中的yield和C#中的yield是类似的,用于创建生成器,执行时中断返回迭代器值,并记录现场,下次从现场处继续执行。

       Unity中的yield就是和C#,python中的类似,因为unity是基于.net框架的,且unity脚本开始是用Boo(Python的一个变种)写的。只是unity中多了coroutine特性类型,和StartCoroutine的coroutine管理类。StartCoroutine不是启动了一个新的线程,而是开启一个协同程序,默认unity所有代码都在一个线程中(http://answers.unity3d.com/questions/280597/new-thread-vs-startcoroutine.html)。

    coroutine语言层面的原理:

    在两年前,协程似乎是一个很高级的东西,随后大多数语言或多或少都支持协程。我比较熟悉的有Python的gevent,Lua的coroutine,Go的goroutine。尤其是Lua和Go,语言本身就支持协程。协程也被叫做轻量级线程。通俗点讲就是定义一大堆任务,然后通过一个线程轮着对每个任务都执行一下,协作运行。它的厉害之处在于每运行到一个任务的时候,它都可以从这个任务上一次中断的地方开始运行。在我们一般的印象中,只有操作系统对线程进行调度的时候才会干这样的事情,进行各种进栈,保存状态。而协程,总共也只是运行在一个线程中,要是使用线程本身的系统栈,早就暴了。因此在这里,实现的时候是用内存来模拟栈的操作。具体实现,我想复杂度一定会不小。

    我们知道,线程比进程轻量级,因此产生一个线程消耗的资源比进程少,上下文切换也比进程节约。而协程比线程更加轻量级,上下文切换更是迅速。于是在服务器编程方面给人无限想象。尽管目前还没有出现一款主流的采用协程的web服务器。但是Go语言开发的web服务的性能已经崭露头角了。


     

    二、Unity的Coroutine执行现象

    第一种方法:  

     voidStart()

        {

           print("Starting " +Time.time);----------------------------------------1

           StartCoroutine(WaitAndPrint(2));-------------------------------------2

           print("Done " +Time.time);-------------------------------------------3

        }

       IEnumerator WaitAndPrint(float waitTime)

        {

           yield return new WaitForSeconds(waitTime);------------------------4

           print("WaitAndPrint " + Time.time);----------------------------------5

        }

    该段代码的执行顺序是12435

    执行到4协程注册了事件,控制权交给外部线程;外部线程执行到3;事件发生,程序分段执行机制goto到协程处记录了堆栈信息执行5语句。


    IEnumerator Start()

        {

           print("Starting " +Time.time);----------------------------------------1

           yield return StartCoroutine(WaitAndPrint(2.0F));------------------------2

           print("Done " +Time.time);------------------------------------------3

        }

       IEnumerator WaitAndPrint(float waitTime)

        {

           yield return new WaitForSeconds(waitTime);----------------------------4

           print("WaitAndPrint " + Time.time);-----------------------------------------5

        }

    该段代码的执行顺序是12453

    Why?这么奇怪的执行方式。

    程序执行到4,执行yield return表达式注册事件交出控制权给外部,因为外部还要交出控制权也需要执行yield return后面的表达式语句因此会重入WaitAndPrint函数接着协程当前状态下一步执行所以执行到5,yield return 后面表达式语句执行完毕控制权完全交出,之后才执行3,根本原因是yield return 不能直接嵌套后面需要跟一个表达式(事件)。


    三、Unity官方文档对coroutine的解释

    Normal coroutine updates are run after theUpdate function returns. Acoroutine is a function that can suspend its execution (yield) until the givenYieldInstruction finishes. Different uses of Coroutines:

     

    yield; The coroutine will continue after all Update functionshave been calledon the next frame.

    yield WaitForSeconds(2); Continueafter a specified time delay, after all Update functions have been called for theframe.

    yield WaitForFixedUpdate(); Continue afterall FixedUpdate has been called on all scripts.

    yield WWWContinue aftera WWW download has completed

    yield StartCoroutine(MyFunc); Chains the coroutine, and will wait for the MyFunc coroutine to completefirst.

     C#要在yield coroutine之间加上return关键字。


    四、Unity中的Coroutine原理猜测

         虚拟机分段执行机制, 同类型嵌套用栈存放实现串行执行:.NET虚拟机在每一帧循环中, 会依次进入每个编译器预定义好的入口。对于Coroutine类型,编译器需要产生一些代码,在Coroutine类型指定的时间或事件完成后(.net的虚拟机用函数指针进行标记管理现场和在流程中每帧检查时间或者事件满足后发送消息,将cpu所有权交给yield中断的现场或是通过包含不同Coroutine迭代器的多个管理类管理各个coroutine, 每帧用coroutine子类通过多态检查时间或事件到达,将cpu所有权交给coroutine子类中断的现场),从yield中断后的代码处继续往下执行, 这样就形成了我们看到的一个function能分段执行的机制

         而对于嵌套Coroutine类型,会串行的执行而不是并行的,可能.net虚拟机对于coroutine类型用栈存放,栈顶的先执行,从而实现串行执行,如果外层的不使用yield return,那么不会串行执行,而是并行执行。于是就可以解释上面例子中的执行次序问题。

    原理图:


     

     见:http://www.richardfine.co.uk/2012/10/unity3d-monobehaviour-lifecycle/

    其实yield WaitForSeconds/null/WaitForEndOfFrame都是通过整个游戏While循环来驱动的,Yield只是交出控制权给外部主线程且Coroutine设置事件挂起Coroutine协程(不是线程只是分段执行机制),当事件发生时候(不用下一帧到达,但是要在固定时间段内Update前或者后或Render后,超过了就会到下一帧)则进入协程里面的代码。

    五、Unity中使用Coroutine需要注意的问题:

    1.使用的地方和不能使用的地方:

    必须在MonoBehaviour或继承于MonoBehaviour的类中调用 yield coroutine。yield不可以在Update或者FixedUpdate里使用。

     

    2.开启协程:

    StartCoroutine(string methodName)和StartCoroutine(IEnumeratorroutine)都可以开启一个协程,

    区别:

    使用字符串作为参数时,开启协程时最多只能传递一个参数,并且性能消耗会更大一点; 而使用IEnumerator 作为参数则没有这个限制。

     

    3.删除协程:

    1).在Unity3D中,使用StopCoroutine(stringmethodName)来终止该MonoBehaviour指定方法名的一个协同程序,使用StopAllCoroutines()来终止所有该MonoBehaviour可以终止的协同程序。

    包括StartCoroutine(IEnumerator routine)的。

    2).还有一种方法可以终止协同程序,即将协同程序所在gameobject的active属性设置为false,当再次设置active为ture时,协同程序并不会再开启;

    如是将协同程序所在脚本的enabled设置为false则不会生效。

     

    4.js和C#中使用区别:

    在C#中要使用 yield return而不是yield。

    C#中yield(中断)语句必须要在IEnumerator类型里,C#方法的返回类型为IEnumerator,返回值如(eg:yield return new WaitForSeconds(2); 或者 yield returnnull);

     

    5.协程函数返回值和参数类型,组合的设计模式:

    协同程序的返回类型为Coroutine类型。在Unity3D中,Coroutine类继承于YieldInstruction,所以,协同程序的返回类型只能为null、等待的帧数(frame)以及等待的时间。

    协同程序的参数不能指定ref、out参数。但是,我们在使用WWW类时会经常使用到协同程序,由于在协同程序中不能传递参数地址(引用),也不能输出对象,

    这使得每下载一个WWW对象都得重写一个协同程序,解决这个问题的方法是建立一个基于WWW的类(用组合模式来解决-其实就是不通过函数传参全局关联一个对象了),并实现一个下载方法。如下:

     

    using UnityEngine;

    using System.Collections;

    public class WWWObject : MonoBehaviour

    {

     public WWW www;

     

     public WWWObject(string url)

     {

     if(GameVar.wwwCache)

      www = WWW.LoadFromCacheOrDownload(url, GameVar.version);

     else

      www = new WWW(url);

     }

     

     public IEnumerator Load()

     {

     Debug.Log("Start loading : " + www.url);

     while(!www.isDone)

      {

      if(GameVar.gameState == GameState.Jumping || GameVar.gameState ==GameState.JumpingAsync)

       LoadScene.progress = www.progress;

      

      yield return 1;

      }

     if(www.error != null)

      Debug.LogError("Loading error : " + www.url + "\n" +www.error);

     else

      Debug.Log("End loading : " + www.url);

     }

     

     public IEnumerator LoadWithTip(string resourcesName)

     {

     Debug.Log("Start loading : " + www.url);

     LoadScene.tipStr = "Downloading  resources<" + resourcesName + "> . . .";

     while(!www.isDone)

      {

      if(GameVar.gameState == GameState.Jumping || GameVar.gameState ==GameState.JumpingAsync)

        LoadScene.progress= www.progress;

      

      yield return 1;

      }

     if(www.error != null)

      Debug.LogError("Loading error : " + www.url + "\n" +www.error);

     else

      Debug.Log("End loading : " + www.url);

     }

    }

    调用:

    using UnityEngine;

    using System.Collections;

    using System.Collections.Generic;

    public class LoadResources : MonoBehaviour

    {

     static string url ="http://61.149.211.88/Package/test.unity3d";

     public static WWW www = null;

     IEnumerator Start()

     {

     if(!GameVar.resourcesLoaded)

     { 

      GameVar.gameState = GameState.Jumping;

      

      WWWObject obj = new WWWObject(url);

      www = obj.www;

      yield return StartCoroutine(obj.LoadWithTip("Textures"));

      

      GameVar.resourcesLoaded = true;

      GameVar.gameState = GameState.Run;

      }

     }

    }

    参考文章:

    http://game.ceeger.com/forum/read.php?tid=13148

    http://www.zhihu.com/question/23895384

    http://blog.csdn.net/tkokof1/article/details/11842673

    http://blog.csdn.net/tkokof1/article/details/12834939

    http://www.richardfine.co.uk/2012/10/unity3d-monobehaviour-lifecycle/

    http://dsqiu.iteye.com/blog/2029701

    展开全文
  • 由于VR的关系,第一次接触到了Unity3D的项目,对C#Script一些语法不是很了解,特别是IEnumerator yield,在项目中大量被使用,下面谈谈对它们的理解,文章转自 作者:王选易,出处: ...
  • 【狗刨学习网】 为什么需要协程 在游戏中有许多过程(Process)需要花费多个逻辑帧去计算。 你会遇到“密集”的流程,比如说寻路,寻路计算量非常大,所以我们通常会把它分割到不同的逻辑帧去进行计算,以免...
  • 最近在研究Unity3D iTween路径规划,今天来记录一下自己的实现步骤,网上搜了好多帖子,都推荐最简单的路径规划实现方法是用iTween 和 iTweenPath实现,但我把iTweenPath 导入工程绑定到目标物体上,一直不动弹,因此...
  • Unity3d DoTweenPro研究 本篇文章是记录在使用DoTweenPro插件中的一些心得体会: DoTweenAnimation组件介绍 DoTweenAnimation组件属性详细介绍 DoTweenPath组件介绍 DoTweenPath组件属性详细介绍 一些...
  • unity3d 与 iOS 的交互

    2013-08-12 10:19:35
    unity3d 通过 编辑器实现代码。资源的整合以后。 编译成ios时候,会把脚本部分翻译成arm指令。资源部分整合进去。 然后通过ios的OPENGL代码实现。 大致看一下ios的代码。unity3d从新实现了arm到C的过程。脚本代码...
  • In Unity scripting, there are a number of event functions that get executed in a ... This execution order is described below:在Unity脚本中,有一些按照预定顺序执行的事件函数,脚本即是按照此顺序执行
  •  今天研究了下Unity3D的寻路功能,忽然发现Unity3D自带的寻路功能只支持付费版,内心不禁感到一阵失落。后来在宣雨松的博客上看到一篇关于ITween的文章,我发现这简直就是我等使用Unity免费版的福音啊,因为这个...
  • unity3d之ITween用法

    2018-05-25 15:13:59
    iTween它由一个c#文件组成,支持Unity所有版本以及不管你用什么编程语言都可以使用它,如果你是用Js,你要将它放在Plugins文件夹里;如果是c#,放在项目的Assets里的任意目录即可。   下面了解一下iTween的基础...
  • Unity3d之背包系统

    2018-06-06 00:17:27
    Unity3d实战之粒子系统 选题要求 参考unity官网的背包系统例子,实现一个简单的背包系统 实现效果 静态图 动态图 知识准备 摄像机渲染 Clearing Flags: Skybox:天空盒(默认项)。在屏幕空白处显示...
  • Invoke() 是unity内置的一个方法 没有重载,只有两个参数,意思是延时方法,在多少时间后调用一个方法 第一个参数是 字符串格式的方法名称,第二个参数以秒为单位的延时时间 public extern void Invoke (string ...
  • 最近对Unity3d进行学习的过程中,发现unity不仅入门教程做的丰富,而且Script API文档也是看过的所有API文档中最清晰易用的。不得不说,这极大降低了入门unity3d的门槛。 Unity3d入门学习资料   Unity3d的学习...
  • Tween的移动类型有很多种,比如匀速运动、加速运动、减速运动,等等。如果你拿捏不准你需要用什么移动类形式。 ... using UnityEngine; using System.Collections; using DG.Tweening; // &......
  • 目录 1.简介: 2.物体移动方法 3.物体的颜色变化 4.摄像机淡入淡出 5.音频方法 6.Look类方法 7.旋转方法 8.物体大小缩放 ...让你做开发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动...
  • Unity3D实验室之优化GC

    2018-04-10 06:58:02
    本文将对Unity介绍的性能改进的文章进行部分翻译,原文地址:https://unity3d.com/jp/learn/tutorials/topics/performance-optimization/optimizing-garbage-collection-unity-games 缓存 void OnTriggerEnter...
  • 转自《Unity3D项目实战笔记(5):延时功能的几种实现》 我所做过的系统,分单机版系统(2005年)、CS系统(2010年)、实时系统(2015年),各个系统均有“延时”功能:定时调度的; 本博客说的是实时系统中的延时...
1 2 3 4 5 ... 20
收藏数 494
精华内容 197
关键字:

delay执行 unity3d