(本人也是刚接触 unity, 以下文字是看完视频以及研究完代码后写的, 有错误的话请在下面评论中指出, 谢谢!)
代码链接: http://pan.baidu.com/s/1bnBGc0Z 密码: t4qz(代码只是一部分)
视频链接: http://www.taikr.com/course/65(视频只讲了一部分, 后续服务器的开发, 电脑的 ai 都没有涉及)
1. 在导入视频文件之前 (包括导入的包内有视频文件), 一定要先安装 quickTime 再导入, 否则导入的视频文件也无法作为 MovieTexture 类型文件使用
2. 视频上的声音问题: 用 MovieTexture 这个类型变量存储视频纹理之后, 在该脚本所在的物体上添加 AudioSource 组件, 添加视频的声音文件 (导入的视频有个小三角点一下会有 quickTime 分离出来的音频文件), 视频播放时, 声音文件会随着视频的播放而播放, 结束时候, 音频文件也会结束, 就是这么神奇
3.awake 一般来讲是在最前面调用, 而 start 在 awake 之后 update 之前调用 (一般来讲)
4.NGUI 菜单栏里有一个 Reset Prefab ToolBar, 里面有很多 NGUI 的工具 NGUI 因为是一个外部插件的问题, 所以有时候会出现意想不到的错误, 重启之后应该就行了
5. 预置物体的作用, 第一个就是凭空产生的物体先预置, 第二个就是当某一群精灵都需要同一个组件时候, 可以先创建一个精灵, 把他弄为预制物体, 然后 ctrl+d 进行复制, 当改变预制物体时候 (例如添加了某个组件), 就给所有复制的物体添加了某个组件
预置物体如果创建了脚本 (相当于给所有复制的物体创建了一个相同的脚本), 里面有 public 变量, 不能进行拖拽控件赋值, 只能分别到每个物体中的 public 变量中拖拽复制, 或者在预制物体的脚本里用代码给变量赋值 (this.transform.parent.getCompment 等等方法)
6.NGUI 中 Atlas Maker 的作用相当于一个合图软件, 把多张小图片拼合成一个大的图片, 创建精灵的时候选择合图, 再选择里面的某一张小图片创建精灵, 这样有利于减少内存的消耗, 类似于 cocos 用 TP
7. 在开发过程中, 在一个场景中一定要设置好物体的 depth, 在 Widget 组件里面的属性, 用来设置物体和物体的叠放顺序类似于 cocos 中的第几层
8. 所谓 c# 的单例类就是可以在任何地方用类型._instance 来调用里面的成员函数和访问里面的静态成员变量, 不用再去查找脚本控件去调用类的方法或者访问类的属性值, 注意所有需要直接访问的函数以及变量都要设置成为 public 访问修饰符, 不仅单例类是, 你如果要在组件中添加的事件是脚本中的函数, 那么脚本中的函数也一定要弄为 public 修饰 (至于为什么, 好好复习 c#j 基础去吧)
9. 在 edict->prefence 里面可以修改编辑器的类型, 可以换成熟练的 vs 进行开发, 还必须下载 unityVS 插件并且导入到项目中, 这样就可以在 vs 中调试 unity 游戏了 (至于具体, 百度吧)
10 关于 unity 中的协程, 他是异步的, 相当于又开了一个线程 StartCoroutine(startGame()),IEnumberator startGame(){ yield new WaitForSeconds(3f) ..}, 他在执行 startGame 中的语句时候, 会同时执行 StartCoroutine 函数所在的函数中剩下的语句, 即是异步的 (有的地方说实际上是不异步的, 但是我们作为初学者, 可以这么理解)
11. 所有能看到的东西都是纹理, 包括视频
12. 面板锁住的时候, 没有办法在 Scene 面板里使用右键菜单
13. 一般来说, Awake 函数要比 Start 函数执行的早, Start 函数在 Update 之前调用 Awake 函数在脚本实例化之后立即调用一般来讲, 初始化变量的工作放在 Start 函数中, 因为有时候你用引用的变量的值初始化另外一个变量的时候, 放在 Awake 函数里面执行的话, 有些太早, 那些引用还没引用到位
14. 写生成物体代码时候, Instantiate(gameObject,Vector3(0,0,0),Rotate()) 第一个参数在脚本中类型为 GameObject, 再拖预制物体到脚本附引用
15. 有时候使用 NGUI 字体显示不能显示中文, 需要切换成其他字体才能显示
16.NGUI 的事件函数, 注意要在物体上绑定 BoxCollider
void OnHover (bool isOver): 当鼠标移出或者悬停在某个碰撞器上的时候返回布尔值. 在触摸设备上不会有作用.
void OnPress (bool isDown): 当鼠标或者触摸到碰撞器发生布尔值返回.
void OnSelect (bool selected): 当鼠标或者触摸从 OnPress 发生后的释放将会返回这个布尔值.
void OnClick(): 和 OnSelect 的产生条件相同, 当点击或触摸碰撞器并且没有发生拖拽时候触发.
void OnDrag (Vector2 delta): 当移动鼠标或者触摸按下时候位移超过特定阀值时触发.
void OnDrop (GameObject drag): 当鼠标或触摸释放于从发生 OnDrag 的不同碰撞器伤触发. 传递的参数是产生 OnDrag 的游戏对象.
void OnInput (string text): 当一个 OnSelect 发生后在同一个碰撞器上触发输入. 一般只有 UIInput 用它.
void OnTooltip (bool show): 当鼠标悬停超过 tooltipDelay 时间后触发该命令. 触摸设备上不会有作用.(直接从 script 中写就行)
17.ob.transform.parent = this.transform;// 改变他的父亲
18. 让有 BoxCollider 的物体添加脚本类中集成 UIDragDrogItem, 该物体就能进行拖拽了, 拖拽完成松手后, 会执行 OnDragDrogRelease 这个函数可以用 override 重写这个函数来进行拖拽完成后的处理工作
19. 禁用某个 gameObject 上的脚本, GetComponent<>().enabled =false;
20.this.tranform.Find() 只能查找他所在物体的子物体, 效率还低, 如果要手动查找其他物体, 用 this.transform.parent.parent 一级一级过度查找直接拖拽物体到引用是效率最快的方法
21.http://www.cnblogs.com/holyknight-zld/archive/2012/08/30/delegateEvent.html (介绍 c# 事件委托比较好的一篇文章)
来源: http://lib.csdn.net/article/unity3d/37012