1、
2、
3、Reset
1、
2、
3、Reset
1、unity的API手册
2、
欧拉角是用来观察的 四元素是用来计算的
api应用程序编程接口
Vector2.
Equals
normalize()单位化,之前的normalized是获取单位方向向量(x,y都改为1/-1值,length不一定为1)
ClampMagnitude(Vector2 v,float maxLength)限定向量长度
Distance当然就是两向量指向坐标的距离值
Dot点乘
Lerp插值和Mathf一样
LerpUnclamped不限定边界插值(110%之类的)
Scale叉乘?
PingPong(t运动速度,length最大来回长度)来回运动
从 Unity 获取时间信息的接口。
captureDeltaTime | 减慢游戏播放时间,以便在帧之间保存屏幕截图。 |
captureFramerate | Time.captureDeltaTime 的倒数。 |
deltaTime | 完成上一帧所用的时间(以秒为单位)(只读)。 |
fixedDeltaTime | 执行物理和其他固定帧率更新(如 MonoBehaviour 的 FixedUpdate)的时间间隔(以秒为单位)。 |
fixedTime | 最近一次 FixedUpdate 已启动的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。 |
fixedUnscaledDeltaTime | 从上一个固定帧到当前固定帧的独立于 timeScale 的时间间隔(以秒为单位)(只读)。 |
fixedUnscaledTime | 最近一次 FixedUpdate 已启动的独立于 TimeScale 的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。 |
frameCount | 已经过的总帧数(只读)。 |
inFixedTimeStep | 如果在固定时间步长回调(如 MonoBehaviour 的 FixedUpdate)内调用,则返回 true,否则返回 false。 |
maximumDeltaTime | 帧可以耗用的最长时间。物理和其他固定帧率更新(如 MonoBehaviour 的 FixedUpdate)将仅在每帧的该持续时间内执行。 |
maximumParticleDeltaTime | 帧可以在粒子更新上耗用的最长时间。如果帧耗用的时间超过该值,则将更新拆分为多个较小的更新。 |
realtimeSinceStartup | 游戏开始以来的实际时间(只读)。 |
smoothDeltaTime | 经过平滑处理的 Time.deltaTime(只读)。 |
time | 该帧开始的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。 |
timeScale | 时间流逝的标度。可用于慢动作效果。 |
timeSinceLevelLoad | 该帧开始以来的时间(只读)。此为自加载上一个关卡以来的时间(以秒为单位)。 |
unscaledDeltaTime | 从上一帧到当前帧的独立于 timeScale 的时间间隔(以秒为单位)(只读)。 |
unscaledTime | 该帧的独立于 timeScale 的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。 |
new gameObject
(人物上下看)俯仰角
=Roatation.x——eulerAngels.x
(人物左右看)水平角
=Roatation.y——eulerAngels.y
(人物倾斜身子看)滚转角
=Roatation.z——eulerAngels.z//如《绝地求生》里面QE倾斜身子射击就涉及到这个值的改变
GetButton:
可以在Eidt-projectsettings-InputManger里面找到虚拟按键的设置选项,使用这个可以使程序更加形象化,如你在攻击时可以自定义一个虚拟按键
name=PlayerAttack
positiveButton:mouse 0(左键)
在调用时可以用
if (Input.GetButtonDown("PlayerAttack"))
{
Debug.Log("PlayerAttack Down");
//To Do Attack
}
为了实时监测,一般需要写在Update()或者实时更新每帧监测的方法里。
Input:
我们主要记住常用的API,最主要是有印象,并且会去查文档。
文档里,Manual——Scripting——Execution Order Of Event Functions就有得查。
在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();//当前物体和所有父亲
脚本创建的时候默认继承的类。其间接地继承了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();//停止全部协程
这类的函数要有识别,物体上必须有Collider,而且这个Collider可以是trigger触发器并且设置里要有勾个选项。这类方法和colliderenter等类似,是满足条件就触发。
void OnMouseDown(){}//按下 void OnMouseUp(){}//抬起 void OnMouseDray(){}//按住拖动 //Over在物体上,Enter进入物体,Exit移除物体
这个类比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
//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系列是结构体。
//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.Range(a,b);//a到b之间的随机数。 Random.InitState();//选择随机数的算法种子,当如 Random.value;//随机0到1的值,包含0,1 Random.insideUnitCircle//圆面随机 Random.insideUnitSphere//球面随机
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.position;//用这个设置移动会更快。如果持续移动最好用MovePsition() Rigidbody.MovePsition();//移动到一个位置,并且更加平滑。 Rigidbody.rotation;//适合用于一次的转动 Rigidbody.MoveRotation();//适合用于持续的转动 Rigidbody.AddForce();//对物体施加力
主要用作与一些运行方面的操作
dataPath;//工程路径 StreamingAssetsPath;//找到一个叫Streaming Assets的文件夹,它用于直接保留文件。 persistentDataPath;//待查 temporaryCachePath;//临时缓冲数据 OpenURL();//打开网页链接 Quit();//退出游戏 //场景加载 Application.Loadlevel(a);//加载第a+1个场景。这个方法已经不怎么用了
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的事件
通过代码添加:
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类是被淘汰了
主要是用于手机的,也就是多个手指的触发。
其实可以使用插件easytouch。
Near与Far:能在相机里显示的范围
Field of view:视野的范围。
Ray ray = Camera.ScreenPointToRay(Input.mousePosition); ray.origin;//射线起点 ray.direction;//射线方向
CharacterController.SimpleMove(f*v); CharacterController.isGrounded; CharacterController.Move(f*v*Time.deltaTime); private void OnControllerColliderHit(ControllerColliderHit hit){}//碰撞触发事件
mesh就是网格,Material就是材质
SceneManagement 代替 Application
1.位置的变化一般使用Lerp,线性插值
2.方向的变化推荐使用slerp,球形插值
球形插值与线性插值(也称为“lerp”)的区别在于, 向量被视为方向而不是空间中的点。
Vector2.Normalize单位化,会对向量产生影响
Vector2.normalized 对向量不产生影响,有返回值,返回单位向量。
?结构体不是不能单独赋值吗?为什么pos可以单独赋值
Vector3 是结构体。
对象中的属性可以直接进行修改,但结构体是值类型,要把它当做整体来进行修改。
将一个结构变量赋值给另一个,或者将结构实例传递到程序变量时,所有变量成员的值会复制到新的结构中。
将一个对象变量赋值给另一个,或者将对象变量传递给程序时,则只是复制指针。
Time.delataTime 当前帧运行占用时间
realtimeSinceStartup 从游戏开始到现在的总时间
smoothDeltaTime
fixefTime
timeScale
GameObject游戏物体
activeSelf
activeInHierarchy
tag
构造方法
Instantiate
CreatePrimitive
AddComponent 添加组件
Tranform
Object Destroy
一个游戏由多个场景组成。
一个场景由多个游戏物体组成。
一个游戏物体由多个组件组成。
组件:Transform、Rigidboy
coroutines 协程方法
void Update () {
Ray ray = new Ray(transform.position+transform.forward , transform.forward);
//bool isu = Physics.Raycast(ray) ;
//bool isu = Physics.Raycast(ray, 1);
RaycastHit hit;
bool isu = Physics.Raycast(ray ,out hit);
Debug.Log(isu);
Debug.Log(hit.collider);
Debug.Log(hit.point);