我们主要记住常用的API,最主要是有印象,并且会去查文档。
事件函数
文档里,Manual——Scripting——Execution Order Of Event Functions就有得查。
Time类
在API里输入Time就能查询;
Time.deltaTime;//每一帧为60分之1秒,主要用于移动。 Time.realtimeSinceStartup;//游戏开始就进行计时,暂行也没用。
创建游戏物体的方法
GameObject one = new GameObject(""); GameObject.Instantiate(prefab); GameObject.CreatePrimitive(PrimitiveType.prefab);//只能用于加基本物体。 GameObject.AddComponent<prefab>();//添加组件 GameObject.SetActive(); gameobject.enable=true or false; GameObject.activeInHierarchy();//判断是否激活。 Object.Destroy();//可以销毁物体,也可以销毁组件,也可以设置销毁时间。 Object.DontDestroyOnLoad(transform.gameobject);//场景跳转保留该物体。 Object.FindObjectOfType<prefab>();//查找有此组件的物体,只找第一个找到的。 Object.FindObjectsOfType<prefab>();//查找有此组件的物体,找到所有的。 Object.Instantiate();//设置物体的位置。 GameObject.name==Component.name;//成立
因为GameObject,Component 他们俩各自继承了Object类。
//GameObject独有的静态方法 GameObject.Find(); //很耗性能。 GameObject.FindGameObjectsWithTag(); //耗性能小。 //广播 GameObject.BroadcastMessage("方法名",参数,是否接收);//广播当前物体和所有孩子,减少耦合性 GameObject.SendMessage();//当前物体 GameObject.SendMessageUpwards();//当前物体和所有父亲
MonoBehaviour
脚本创建的时候默认继承的类。其间接地继承了Component
Invoke("函数名",int time);//几秒后调用函数 IsInvoking("函数名");//判断该函数是否在Invoke队列里。 InvokeRepeating("函数名",a,b);//函数在a秒后执行,并且之后每b秒执行一次。 CancelInvoke("函数名");//取消执行某函数
协程的解释和执行
协程方法不会阻塞其他方法的执行,并且能够暂停。
Manual——Scripting——Coroutines 就能够查到用法。
就是一组代码里面,每行代码要一行行运行,但是携程可以边运行边执行下面的其他代码。
//两个要素,IEnumerator 和 yield return null/0 IEnumerator ChangeColor()//创建携程 { yield return new WaitForSeconds(3);//暂停的方法 ...; yield return null; } //一般是要创个IEnumerator 的量来实例化协程,再用如下的方法,停止协程才能正常进行。 StartCoroutine(ChangeColor()); //调用协程,里面可以用("函数名")的方式用。 StopCoroutine(ChangeColor()); //停止协程 StopAllCoroutine();//停止全部协程
鼠标相关事件函数OnMouseXXX
这类的函数要有识别,物体上必须有Collider,而且这个Collider可以是trigger触发器并且设置里要有勾个选项。这类方法和colliderenter等类似,是满足条件就触发。
void OnMouseDown(){}//按下 void OnMouseUp(){}//抬起 void OnMouseDray(){}//按住拖动 //Over在物体上,Enter进入物体,Exit移除物体
Mathf类的使用
这个类比C#的math类更好用一些chen
Mathf.Deg2Rad;//角乘这个数就会面为弧度 Mathf.Rad2Deg;//和上面相反 Mathf.Epsilon;//无穷小,接近0但是不是0 Mathf.Infinity;//无穷大 Mathf.PI;//就是字面意思 Mathf.NegativeInfinit;//无穷小的数 //方法 Abs();//取绝对值 Ceil();//向上取整,返回float CeilToInt();//向上取整,int Clamp(a,b,c);//把a的值限制在b到c之间 ClosestPowerOfTwo();//得得离2的n次方最近得数 DeltaAngle(a,b);//a和b之间的最小夹角 Floor();//向下取整 Max();//取最大值 Min();//取最小值 Sqrt();//取平方根 Pow(a,b);//a的b次方 //匀速运动,x代表的是每帧运行的距离 MoveTowards(a,b,x);//从a移动到b,x是速度,-就是往反向移动。一般是Time.deltaTime*Speed //插值运算,一般把t设置为Time.deltaTime*Speed Lerp(a,b,t); //t代表比例,取值为0到1之间,按比例取a到b之间得值。 //来回运动,总之就是在一个范围来回运动,可以用Time.deltaTime*Speed代表t。 PingPong(t,length);//if(0<t<length),返回值就是t,if(length<t<2length),返回2length-t
Input类
//GetKeyXXX系列 GetKey();//持续判断一直按下 GetKeyDown();//按下执行一次 GetKeyUp();//抬起执行一次 //能接收的键盘类型为KeyCode类和字符串类型
//鼠标按键事件监测,0:左键,1:右键,2:中间滚轮 GetMouseButton(); GetMouseButtonDown(); GetMouseButtonUp();
//GetButtonXXX系列 //这个系列是判定虚拟按键的,虚拟按键在软件里的Input Setting里设置。 //好处:一个button name可以对应多个按键
//GetAxis系列,与上面的区别在于 //其他的返回值是bool类型,而这个系列返回的是数值。 GetAxis();//0到1的渐变 GetAxisRaw();//0直接到1
Input.anyKeyDown;//持续判断,鼠标是否按下 Input.mousePosition;//持续判断,以像素为单位,鼠标在屏幕上的位置
Vector系列
Vector系列是结构体。
//Vextor2系列 //变量 up,down,left,right,one,zero; normalized;//长度变为1,取得单位化的值 magnitude;//求长度 sqrMagnitude;//这个是还没开根号的,更节约性能,用于比较长度 //方法 Equals();//比较相等 Normalized();//把自身单位化 Set();//用于设置值 Abgke();//夹角 ClampMagnitude();//限制长度 Distance();//向量距离 Dot();//点乘 Lerp();//插值运算 LerpUnclamped();//不限制大小的插值。
//Vector3系列,左手坐标系 up,down,left,right,one,zero,forward,back;
Random系列
Random.Range(a,b);//a到b之间的随机数。 Random.InitState();//选择随机数的算法种子,当如 Random.value;//随机0到1的值,包含0,1 Random.insideUnitCircle//圆面随机 Random.insideUnitSphere//球面随机
Quaternion系列
cube.eulerAngle = new Vector3(45,45,45); cube.rotation = Quaternion.Euler(new Vector3(45,45,45)); Quaternion.LookRotation(vector3 dir);//转向 Quaternion.Lerp();//插值,以直线为准 Quaternion.Slerp();//插值,以曲线为准
Rigidbody刚体
Rigidbody.position;//用这个设置移动会更快。如果持续移动最好用MovePsition() Rigidbody.MovePsition();//移动到一个位置,并且更加平滑。 Rigidbody.rotation;//适合用于一次的转动 Rigidbody.MoveRotation();//适合用于持续的转动 Rigidbody.AddForce();//对物体施加力
Application类
主要用作与一些运行方面的操作
dataPath;//工程路径 StreamingAssetsPath;//找到一个叫Streaming Assets的文件夹,它用于直接保留文件。 persistentDataPath;//待查 temporaryCachePath;//临时缓冲数据 OpenURL();//打开网页链接 Quit();//退出游戏 //场景加载 Application.Loadlevel(a);//加载第a+1个场景。这个方法已经不怎么用了
SceneManager
using UnityEngine.SceneManagement; SceneManager.LoadScene();//可通过标号或者名字添加,后面有LoadSceneMode参数 //两种方式 Single(销毁前一个)和Additive(保留前一个) SceneManager.LoadSceneAsync();//异步方式添加场景,用于展示进度条。 SceneManager.GetActiveScene().name;//获取当前场景 SceneManager.GetSceneAt();//获取其他场景的信息 SceneManager.activeSceneChanged += hanshu;//场景转换执行 SceneManager.sceneLoaded += hanshu;//场景加载执行
射线系列
Ray ray = new Ray(); RaycastHit hit; Physics.Raycast();//用于检测碰撞和设定射线的检测范围 Physics2D.Raycast();
UGUI的事件
三种方法:
-
通过拖拽的方式监听UGUI的事件
-
通过代码添加:
public GameObject button1; button1.GetComponent<Button>().onClick.AddListener(this.方法名); //滑块要输入float参数的,所以给slider的函数得要有(float value)参数 slider1.GetComponent<Slider>().onValueChanged.AddListener(this.方法名); //下拉块,要(Int32 value)的参数接收 dropDown1.GetComponent<Dropdown>().onvalueChanged.AddListener(this.方法名); //Toggle这种选项块,理所当然地要有(bool value)参数
-
通过实现接口:查询Supported Events
要先确定UI的Raycast Target是勾选的
-
1 IPointerDownHandler:按下触发
-
2 IPointerClickHandler:按下弹起触发
-
3 IPointerUpHandler:弹起触发
-
4 IPointerEnterHandler:进范围触发
-
5 IPointerExitHandler:出范围触发
这个脚本放在哪里就只能控制哪个
using UnityEngine.UI; using UnityEngine.EventSystems; public class UIName:MonoBehaviour,IPointerDownHandler //通过继承与实现接口
www类
目前www类是被淘汰了
Touches触摸事件
主要是用于手机的,也就是多个手指的触发。
其实可以使用插件easytouch。
Camera
-
Near与Far:能在相机里显示的范围
-
Field of view:视野的范围。
Ray ray = Camera.ScreenPointToRay(Input.mousePosition); ray.origin;//射线起点 ray.direction;//射线方向
CharacterController类
CharacterController.SimpleMove(f*v); CharacterController.isGrounded; CharacterController.Move(f*v*Time.deltaTime); private void OnControllerColliderHit(ControllerColliderHit hit){}//碰撞触发事件
Mesh与Material
mesh就是网格,Material就是材质
一些注意的地方
SceneManagement 代替 Application