脚本生命周期:
- Awake:脚本唤醒,此方法相当于类的初始化方法,只执行一次
- Start:只执行一次
- Update:正常更新,用于更新逻辑,每帧调用一次
- LateUpdate:推迟更新:在Update之后执行,每帧调用一次
- OnGUI:绘制界面,每帧调用
- OnDestroy:当前脚本销毁时调用
- FixedUpdate:固定更新:根据固定时间来更新,常用于模型移动等操作,在Edit->Project Setting->Time菜单可更改更新频率。这个执行先后,根据频率有关,默认在Update之前
脚本创建对象:GameObject.CreatePrimitive(类型),类型是PrimitiveType.
获取对象:
- 通过名称:GameObject.Find("路径/对象名"),
- 通过标签:GameObject.FindWithTag(“标签”),
- 通过标签取多个:GameObject.FindObjectsWithTag(“标签”);得到一个数组
给对象添加组件(脚本):
- 添加:游戏实例对象。addComponent();
- 取得:游戏实例对象。getComponent();
- 删除:由于组件自身没有删除方法,要删除需要父类执行Object.Destory(游戏对象|游戏组件),
克隆游戏对象:
Instantiate("要克隆对象',位置,转动角度),
销毁对象:
Destroy(“对象”,延迟几秒); 也可以删除组件如:Destroy(对象。getComponent(“组件名”));删除后引发OnDestroy()事件
控制游戏对象变换:Transform
任何一个游戏对象在创建时都会附带一个Transform(变换)组件,而且无法删除。该组件常用方法有:
位置:Transform.Position值:Vector3
旋转:Transform.Rotation
X轴转:Vector3.rightY轴转:Vector3.upZ轴转:vector.forward
绕某点转:RotateAround(点位置Vector3类型,角度:也是X,Y,Z三个方向);
缩放:Transform.localScale,值:Vector3(X,Y,Z), 三个方向系数
JS和C#方法互调:
取得组件:cs = obj.GetComponent(“组件名”);,cs.方法();
工具类:时间,等待,随机,数学,四元数
时间:Time,主要用来获取当前的系统时间
- Time.time游戏运行总时间
- Time.delaTime获得Update()方法完成上帧所用时间
- Time.fixedTimeFixedUpdate()方法固定消耗时间总和
- Time.fixedDelaTime固定更新上一帧所消耗的时间
等待:WaitForSeconds(秒数),使游戏主线程进入等待状态,返回值为IEnumerator类型,
调用方式
yield return new WaitForSeconds(时间)
随机数:Random.Range(最小值,最大值);
数学:Mathf
光源:点光源PointLight,聚光灯Spotlight,平行光DirectionalLight
摄像机:
放射观察,垂直观察,代码中设置这两种观察方式:取得摄象机,然后摄像机。isOrthoGraphic = ture|false,对应垂直与放射,
切换摄像机:摄像机。action = true|false,开|关
物理引擎:刚体,力,碰撞与休眼,磁撞器,角色控制器,射线,关节,粒子,
刚体:Rigidbody
力:
- 普通力,需要设定方向与大小, obj.rigidbody.AddForce(1000,0,1000)添加一个X,Y两轴的1000力,
- 目标位置力:设定目标点的位置和大小。obj.rigidbody.AddForceAtPosition(力大小,目标点坐标,力模式ForceMode.模式)
碰撞与休眠:一旦刚体移动,就可以在系统方法中监听刚体的碰撞事件,有三种事件处理函数。
- 进入:OnCollisionEnter(Collision cl){}
- 碰撞中:OnCollisionStay(Collision cl){}
- 结束:OnCollisionExit(Collision cl){}
- 三个事件的参数可以通过cl.gameObject得到当前碰撞的游戏对象
体眠:就是让物体进入静态状态,比如我们可以在结束事件里写上l.gameObject.rigidbody.Sleep();
碰撞器:当刚体添加碰撞器后,相互会反弹,反弹力度由物理材质决定的,添加碰撞器,选择游戏对象->Component->Physics
- 盒子碰撞器(BoxCollider):适用于立方体对象之间
- 球体碰撞器(SphereCollider):适用于球体对象之间
- 胶囊碰撞器(CapsuleCollider):适用于胶囊体对象之间
- 网格碰撞器(MeshCollider):由自定义模型的自身网格决定
- 车轮碰撞器(WheelCollider):适用于车轮与地面或其它对象之间
物理材质
物理材质可设定物体的表面材质,不同的材质可影响碰撞后的物理效果,Unity提供了物理材质包,
Import Package->Physic Materials,有5种常用,弹性(Bouncy),冰(Ice),金属(Metal),橡胶(Rubber),木头(Wood),
角色控制器:Unity已经提供了角色控制器的包,其中有第一人称与第三人称,只需要导入即可Import Package->Character Controller,导入后呵以找到First Person Controller和3rd Person Controller两个,直接拖动到游戏场景中,就可以看到相关效果,另外,也可以给别的游戏对象添加控制组件
控制组件:当我们导入角色控制器后,如果想要给别的游戏对象添加角色控制器,如何添加,只需要确定你导入角色控制器,然后选定你的游戏对象,Component->Physics->Character Controller即可,添加后需要在脚本中添加相应的处理,取得组件GetComponent<CharacterController>(),常用组件方法:移动有SimpleMove()和Move(),
射线:从某个点向一个方向发射的一条无终点的钱,一旦与其它对象碰撞,将停止发射。
//创建一个射线
Ray ray = new Ray(Vector3.zero,transform.position);
//创建一个从摄像机到鼠标之间的射线
Ray ray= Camera.main.ScreenPointToRay(Imput.mousePosition);
//计算射线起点与终点
RaycastHit hit;
physics.RayCast(ray,out hit,100);
//判断是否打中对象
if(physics.Raycast(ray,out hit))
{
//打中
}
关节,粒子,布料
路径渲染:属于特效渲染组件,用于跟随运动中的游戏对象。添加:Component->Effects->Trail Renderer,
键盘事件:
// Update is called once per frame
void Update () {
if (Input.GetKeyDown (KeyCode.A)) {
//按下A键
}
if (Input.GetKeyUp (KeyCode.A)) {
//抬起A键
}
//长按
if (Input.GetKey (KeyCode.A)) {
//记录按下的帧数
Keyframe++;
}
if (Input.anyKeyDown) {
//任意键被按下
}
if (Input.anyKey) {
//任意键被长按
Keyframe++;
}
//鼠标事件,0左键,1右键,2中键
if (Input.GetMouseButtonDown(0)) {
//鼠标当前位置
Input.mousePosition;
}
if (Input.GetMouseButtonUp(0)) {
}
//长按
if (Input.GetMouseButton(0)) {
//任意键被长按
MouseFrame++;
}
}
自定义按钮:Edit->Project Settings->Input,对应的自定义按钮事件:Input.GetButtonDown(),Input.GetButton(),InputGetButtonUp()
按钮轴:Input.getAxis();
持久化数据-PlayerPrefs类:
//保存整型
PlayerPrefs.SetInt("test",100);
PlayerPrefs.SetFloat("test",100.00f);
PlayerPrefs.SetString("test","afaf");
//读取整型,参数,数据名称,默认值,
int i= PlayerPrefs.GetInt("test",112);
if(PlayerPrefs.HasKey("test")){
//删除所有
PlayerPrefs.DeleteAll();
//删除某项
PlayerPrefs.DeleteKey("test");
}
自定义文件-FileInfo,StreamWriter,StreamReader:
应用程序类:Application
//切换新场景
Application.loadedLevel("场景ID");
//截屏
Application.CaptureScreenshot("name.png");
//打开URL
Application.OpenURL("http://www.baidu.com");
//退出应用
Application.Quit();
//当前场景名
Application.loadedLevelName;