(1)多线程程序同时运行多个线程,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。
(2)除主线程之外的线程无法访问Unity3D的对象、组件、方法。
(3)Unity3d没有多线程的概念,不过unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。
(4)StartCoroutine为什么叫协同程序呢,所谓协同,就是当你在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。而LoadLevelAsync则允许你在后台加载新资源和场景,所以再利用协同,你就可以前台用loading条或动画提示玩家游戏未卡死,同时后台协同处理加载的事宜
Unity的脚本语言基于Mono的.Net平台上运行,可以使用.NET库,这也为XML、数据库、正则表达式等问题提供了很好的解决方案。
Unity里的脚本都会经过编译,他们的运行速度也很快。这三种语言实际上的功能和运行速度是一样的,区别主要体现在语言特性上。
JavaScript:和网页中常用的JavaScript不一样,它编译后的运行速度很快,语法方面也会有不少区别。
C#
Boo:可以看做是Python语言的变种,又糅合了Ruby和C#的特性,它是静态类型语言
仅能从主线程中访问Unity3D的组件,对象和Unity3D系统调用
Awake-》OnEnable-》Start
OnEnable在同一周期中可以反复地发生
当物体是否可见切换之时。可以用于只需要在物体可见时才进行的计算。
Resource.Load
AssetBundle.Load
三个阶段,OnCollisionEnter/Stay/Exit函数
rigidbody.AddForce/AddForceAtPosition,都是rigidbody的成员函数
transform.Rotate
transform.RotateAround
PlayerPrefs.SetInt与PlayerPrefs.GetInt
Awake–>OnEnable–>Start–>Update–>FixedUpdate–>LateUpdate–>OnGUI–>Reset–>OnDisable–>OnDestroy
FixedUpdate,每固定帧绘制时执行一次,和update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。
LateUpdate,,是在所有update结束后才调,比较适合用于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
一般是组件上绑定的物体对象被删除了
在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个线程。可以用来控制运动、序列以及对象的行为。
反转动画,讲动画的速度调到-1,碰撞时,被碰撞物体与碰撞物体有collider组件,碰撞物体有刚体组件,或角色碰撞得包含角色组件OR改变animation.speed
publicclassPlayer:MonoBehaviour{
publicTransform_cameraTrans;
privateVector3_cameraOffset;
voidAwake(){
_cameraOffset=transform.position-_cameraTrans.position;
}
voidUpdate(){
_cameraTrans.position=transform.position-_cameraOffset;
吊机吊物体需要节点挂接和坐标系转换
获取:GetComponent
增加:AddComponent
删除:Destroy
A.动画放大B.动画转换C.动画的淡入为其他动画
A.加载关卡B.异步加载关卡C.加载动作
Debug.Log();
工程目录下的Assets/Editor文件夹下。
GUI.DragWindow();
localPosition:自身位置,相对于父级的变换的位置。Position:在世界坐标transform的位置
Mathf.Round四舍五入
Mathf.Clamp限制
Mathf.Lerp插值
privatefloattimer=0f;
privateinth=0;
privateintm=0;
privateints=0;
privatestringtimeStr=string.Empty;
timer+=Time.deltaTime;
if(timer>=1f){s++;timer=0;}
if(s>=60){m++;s=0;}
if(m>=60){h++;m=0;}
if(h>=99){h=0;}
voidOnGUI(){
timeStr=string.Format("{0:D2}:{1:D2}:{2:D2}",h,m,s);
GUI.Label(newRect(10,10,100,200),timeStr);
AddClip添加剪辑、Blend混合、Play播放、Stop停止、Sample采样
在场景中添加一个Plan,Camera,DirectionalLight,Cube。添加两个脚本scrollerScirpt(挂在Camera),CubeDragScript(挂在Cube上)。
1.鼠标滚轮实现缩放:将摄像机的镜头拉近或者拉远,调整摄像机的视角就可以实现,主要实现代码如下:
//鼠标滚轮的效果
if(Input.GetAxis("MouseScrollWheel")<0){
if(Camera.main.fieldOfView<=100)
Camera.main.fieldOfView+=2;
if(Camera.main.orthographicSize<=20)
Camera.main.orthographicSize+=0.5F;
//Zoomin
if(Input.GetAxis("MouseScrollWheel")>0){
if(Camera.main.fieldOfView>2)
Camera.main.fieldOfView-=2;
if(Camera.main.orthographicSize>=1)
Camera.main.orthographicSize-=0.5F;
2.鼠标实现在场景中拖动物体:
解决思路就是将世界坐标转换成屏幕坐标,然后计算物体与鼠标之间移动量,循环鼠标被按下操作,得到鼠标的当前位置,加上计算好的移动量,将新的坐标赋值给物理就行了。主要是开启一个协同程序(Corountine)来处理
主要代码如下:
//Usethisforinitialization
voidStart(){
StartCoroutine(OnMouseDown());
IEnumeratorOnMouseDown(){
//将物体由世界坐标系转换为屏幕坐标系
Vector3screenSpace=Camera.main.WorldToScreenPoint(transform.position);
//完成两个步骤1.由于鼠标的坐标系是2维,需要转换成3维的世界坐标系
//2.只有3维坐标情况下才能来计算鼠标位置与物理的距离,offset即是距离
//将鼠标屏幕坐标转为三维坐标,再算出物体位置与鼠标之间的距离
Vector3offset=transform.position-Camera.main.ScreenToWorldPoint(newVector3(Input.mousePosition.x,Input.mousePosition.y,screenSpace.z));
while(Input.GetMouseButton(0)){
//得到现在鼠标的2维坐标系位置
Vector3curScreenSpace=newVector3(Input.mousePosition.x,Input.mousePosition.y,screenSpace.z);
//将当前鼠标的2维位置转换成3维位置,再加上鼠标的移动量
Vector3curPosition=Camera.main.ScreenToWorldPoint(curScreenSpace)+offset;
//curPosition就是物体应该的移动向量赋给transform的position属性
transform.position=curPosition;
yieldreturnnewWaitForFixedUpdate();//这个很重要,循环执行
1、主要是在UICamera脚本中用射线判断点击的物体并通过SendMessage调用OnClick()OnPress()等函数,可以说NGUI的按钮是通过发消息这个方式调用的。具体方法名称是OnClick()
2、voidAwake(){
//获取需要监听的按钮对象
GameObjectbutton=GameObject.Find("UIRoot/Button3");
//设置这个按钮的监听,指向本类的ButtonClick方法中。
UIEventListener.Get(button).onClick=OnButton3Click;
privatevoidOnButton3Click(GameObjectbutton){
Debug.Log("我是按钮3被点击了");
1、使用预制物体对象Prefab
2、使用对象池技术,不使用时关闭,使用时打开
能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器
【Physics.OverlapSphere相交球检测碰撞,碰撞检测需要包围盒】
对
MonoBehaviour.OnLevelWasLoaded
iTween是一个动画库,作者创建它的目的就是最小的投入实现最大的产出。让你做开发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制音频等等“方法:
a、MoveTo物体移动;
Transform父类是Component
给子控件设置上下两个锚点为10
设置子控件锚点为中心
Strings="你是坏蛋";
s.Replace("坏蛋","**");
Awake()
OnEnable()
Start()
FixedUpdate()
OnTriggerXXX(Colliderother)
OnCollisionXXX(CollisioncollisionInfo)
Update()
LateUpdate()
OnGUI()
OnDisable()
OnDestroy()
resource一般用来放置一些需要动态加载的资源,打包程序的时候会将Resource目录下的全部文件都加密压缩打进包内,这样再想使用assetbundle方式打小包的话就不行了
publicfloatSpeed=1;
transform.RotateAround(newVector3(0,1,2),Vector3.up,Speed);
A.可被用于将TextAssets自动缓存到本地磁盘
B.可被用于将Resource自动缓存到本地磁盘
C.可被用于将AssetsBundles自动缓存到本地磁盘
D.可被用于将任意的Unity资源文件自动缓存到本地磁盘
A:MonoBehaviour.OnSceneWasLoaded
B:MonoBehaviour.OnSceneEnter
C:MonoBehaviour.OnLevelWasLoaded
D:MonoBehaviour.OnLevelEnter
A.当MonoBehavior类型应用后,每帧调用一次
B.常被用于处理RigidBody的更新
C.在所有Update函数执行后才能被调用
D.常被用于实现跟随相机效果,且目标物体的位置已经在Update函数中被更新
A.GetComponent
B.GetComponent