脚本生命周期:
- 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.right Y轴转:Vector3.up Z轴转: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.fixedTime FixedUpdate()方法固定消耗时间总和
- 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;