1,让一个物体围绕某一点旋转,有几种方法?分别是什么?
答:见 http://blog.csdn.net/qiaoquan3/article/details/51306514答:
如果是NGUI修改粒子的renderQueue,修改尽量大就在所有UI上面,如果希望在2个UI之间就需要看看NGUI源码,http://m.blog.csdn.net/blog/yxriyin/44037673
如果是UGUI一种是可以使用相机把处理粒子,一种是设置sortingOrder http://www.xuanyusong.com/archives/3435(1)修改Ngui中的UIPanel脚本中的默认的RenderQueue, 调整到3000以下,这样就不会遮挡住粒子特效了,当有的窗口需要显示在特效上面时,在检视面板中把该窗口的Renderer Q选项调整为Start At,值为3000以上,就可以解决,不过我的NGUI版本为3.1.6,所以可以直接调整。
(2)使用另外一个摄像机,显示特效。但是在UI窗口相互切换时,不太好控制。
(3)修改粒子特效的Shader中的RendererQueue值。答:会发生穿透(碰撞检测失败)
解决方法:Awake ->OnEable-> Start -> FixedUpdate-> Update -> LateUpdate ->OnGUI ->Reset -> OnDisable ->OnDestroy
Awake:用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次.Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如GameObject.FindWithTag()这样的函数搜索它们。每个游戏物体上的Awake以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息,Awake总是在Start之前被调用。它不能用来执行协同程序。Update:正常帧更新,用于更新逻辑。每一帧都执行,Update是在每次渲染新的一帧的时候才会调用,也就是说,这个函数的更新频率和设备的性能有关以及被渲染的物体(可以认为是三角形的数量)。在性能好的机器上可能fps 30,差的可能小些。这会导致同一个游戏在不同的机器上效果不一致,有的快有的慢。因为Update的执行间隔不一样了。FixedUpdate比较适用于物理引擎的计算,Update就比较适合做控制。
FixedUpdate:而FixedUpdate,是在固定的时间间隔执行,不受游戏帧率的影响。有点想Tick。所以处理Rigidbody的时候最好用FixedUpdate。
//调用时刻:
(1)Awake() : 脚本加载的时候调用,而脚本加载的时候意思为:对象(脚本所在的gameObject)第一次enable,即对象被加载的时候,脚本未启用(启用就是enable状态)也会执行。awake函数受游戏对象初始状态的影响, 当状态关闭,不调用;状态开启,调用;开启后关闭再重新开启,不调用.与与之绑定的脚本实例启用状态无关。
(2)Start() : 脚本运行时调用,在对象enable的情况下,脚本第一次enable,就是脚本运行的时刻。start函数受游戏对象上绑定的脚本实例启用状态相关, 脚本实例启用,调用; 关闭,不调用;开启后关闭再重新开启,不调用(3)Update()在Start()之后每帧调用一次时间不是固定的,用于游戏更新场景和状态。
8,数列 1,1,2,3,5,8,13... 第 n 位数是多少 ? 用 C# 递归算法实现
Func(n) { if (n==1) return 1; if (n==2) return 1; return Func(n-1)+Func(n-2); }
9,当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存?
答:
(1)保存成prefab,物体对象从prefab里拖拽生成,或者代码生成。
(2)使用AssetBundle也可以降低一定内存。
(3)采用对象池,使用对象池,将要重复创建的对象先创建一定的数量,然后隐藏起来,重置参数和位置,以便下一次利用;当要使用的时候在显示出来(setactive),插件pool manager也可以。切换场景之后可以进行回收。理想状态下自己管理所有的对象,CG机制只起辅助作用。参考代码如下:
//key为T类型子弹,value为创建的所有的T类型子弹 private Dictionary<System.Type,List<BulletBase>> pool; //从子弹池中取出一个子弹 protected BulletBase GetBullet<T>() { BulletBase temp = null;//子弹父类 System.Type type = typeof(T);//子弹T类型 bool needCreate = false;//是否需要重新创建 if(pool == null)//对象池为空 { needCreate = true; pool = new Dictionary<System.Type, List<BulletBase>>(); }else if(pool.Count == 0)//对象池已创建但没有数据 { needCreate = true; }else { if(pool.ContainsKey (type))//对象池包含T类型子弹 { temp = pool[type].Find (o=>!o.IsBusy);//对象池查找不在使用的T类型子弹 if(temp ==null){ needCreate = true; } }else { needCreate = true; } } if(needCreate)//需要重新创建T类型子弹 { BulletBase tempMemery = Resources.Load<BulletBase>("BulletAI/"+bulletOrginalName); if(tempMemery!=null){ temp = GameObject.Instantiate<BulletBase>(tempMemery); tempMemery = null; } Resources.UnloadUnusedAssets (); if(!pool.ContainsKey (type))//没有T类型子弹 { pool.Add (type, new List<BulletBase>()); } pool[type].Add (temp); } return temp; }<span style="font-family:Helvetica Neue, Helvetica, Arial, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif;color:#0000ff;"><span style="font-size: 14px; line-height: 21px;"><strong> </strong></span></span>
法三:AssetDatabase.loadasset,只在编辑器模式下有效
具体的来说:
通过Resources模块,调用它的load函数:可以直接load并返回某个类型的Object,前提是要把这个资源放在Resource命名的文件夹下,Unity不管有没有场景引用,都会将其全部打入到安装包中。
通过bundle的形式:即将资源打成 asset bundle 放在服务器或本地磁盘,然后使用WWW模块get 下来,然后从这个bundle中load某个object。
通过AssetDatabase.loadasset :这种方式只在editor范围内有效,游戏运行时没有这个函数,它通常是在开发中调试用的
Resources.Load()和Assetbundle的区别Resources资源的加载是动态加载内部的,AssetBundle 是动态加载外部的 .
Resources在编辑环境下是project窗口的一个文件夹,调用里面的资源,可以用Resources类,比如Resources.Load,打包后这个文件夹是不存在的,会统一生成assets资源,AssetBundle 是外部调用,要用AssetBundle 首先要先把资源打包为.assetbundle文件,再动态的去加载这个文件,本地或者网络服务器都可以。