Mathf.floor:向下取整
Mathf.sqrt:取得平方根
Mathf.Pow(f,p):取得f的p次方
Mathf.floor:向下取整
Mathf.sqrt:取得平方根
Mathf.Pow(f,p):取得f的p次方
Abs:取绝对值
Ceil:向上取整
Mathf.Clamp(属性值,min,max);
比min小,就取min
bimax大,就取max
介于两者之间就取value
Mathf.Deg2Rad:弧度转角度
Mathf.Rad2Deg:角度转弧度
Mathf.PI;代表Π
Mathf.NegativeInfinity:负的无限小的数
Mathf.Epsilon:代表是一个无限小的数字
Mathf.Infinity:代表是一个无限大的数字
协程的开启和停止
StartCoroutine();
StopCoroutine();
实现有两种方式:
一种是写方法名
一种是创建一个IEnumerator对象,然后将对象传入方法种。
差值变化方法(变化效果平滑) :
Lerp(现在的状态,目标状态,每次状态转变的距离);
普通方法和协程方法:
普通方法:自上而下的运行,当方法被调用的时候,会暂停当前的程序,先执行完调用的方法,然后继续执行程序。
协程方法:被调用的方法和程序共同执行,并且协程方法还可以控制自己的运行时间。
协程方法的格式:
1 定义协程方法:
IEnumerator 方法名()
{
方法体;
yield return null;
}
2 协程方法的调用:
StartCoroutine(协程方法());
Invoke就是将方法放在队列中,等待在设置的时间进行调用
Invoke("方法名",延时调用的时间);
CancelInvoke("方法名 ");//从等待队列去除Attack方法。如果括号中不写方法名,则去除所有的方法
InvokeRepeating("方法名",time1,time2);
time1:代表多少秒后开始调用
time2:代表多少秒调用一次
游戏物体设置状态时:gameobjedt.SetActive(true/false);
组件设置状态时 component.enable = true/false;
可以通过游戏物体直接获得身上的游戏物体身上的组件,也可以利用游戏物体身上的组件获得其他的组件
15.MonoBehaviour
1.在ScriptingAPI中快速搜索
在搜索时,快速搜索的方法是输入搜索类的前几个单词即可。
MonoBehaviour继承Behaivour,Behaviour继承Component。
MonoBehaviour间接继承Component,
2.MonoBehaviour内容
2.1 Variable
runInEditMode——编辑器模式下操作;
useGUILayout——(不常用)
2.2 Invoke
Concel Invoke——取消调用方法
Invoke——调用方法
InvokeRepeating——
isInvoking——
3.静态方法
13.游戏物体间消息的发送和接收
1.PublicFunction
1.1BroadcastMessage(广播消息,即调用一个方法),——调用一个游戏物体和它所有的子物体上的方法;
问:为什么不直接去调用一个方法呢?
因为直接调用某个方法,我们必须那个这个方法脚本组件的引用,然后在去调用,拿到引用还需要通过其的方式,有些情况下,可能拿不到引用。通过广播方式,发出一个消息,看看场景中的游戏物体是否有对应的函数,可以调用。通过广播的方式,可以减少游戏的偶合性,即A引用B,B引用C,C引用A,这样一个方法改变,其他的都会跟着改变,很是复杂。
1.2SendMessage——调用当前物体上的方法;如果当前物体上有多个脚本,只要脚本中有这个方法名,都能被调用。
1.3 SendMessageUpwards——调用当前物体和当前物体的父物体上的方法。、
注意:通过发送消息的方法去调用信息,只要对应物体上脚本组件中,有这个方法名的都可以调用。
例如:
A脚本中发送广播调用B脚本中的方法
A脚本:
public GameObject target;
target.BraodCastMessage("Attack",null,SendMessageOptions.DontRequireReceiver);
//注意BroadClassMessage这个方法如果的一个参数是函数名,第二个参数是调用方法参数,第三个参数广播的消息是否一定需要接受者,需要——RequireReceiver,如果没有出现接受者,那么会出现报错,DontRequireReceiver,不一定需要接受者,这样不会出现报错。
B脚本中:
添加一个在脚本类中添加一个函数方法;
void Attack(){
print(this.GameObject+“:攻击它”);
}
12.GameObject独有的静态方法
1.GameObject的静态方法
CratePrimitive——创建初始几何体;
Find——通过名称来查找; 和FindGameObjectWithTag相同;
FindGameObjectsWithTag——通过标签来查找,这个方法是查找是这个标签的所用游戏物体,返回的是一个数组。
FindWithTag——通过标签来查找,这个方法只会返回第一个符合条件的;
11.UnityEngine下Object拥有的静态方法
1.什么是静态方法
public class per{
public static String GetType(){
return("人类");
}
}
如果是静态方法,可以这样引用
String type = per.GetType();
如果不是静态方法,这样引用是错误的,需要:
per p = per.GetType();
或者:per p;
String type = p.GetType();
静态方法的创建需要在方法前加一个static,静态方法和静态变量一样,属于类本身,不属于那个类的对象,它不像非静态方法一样,通过类对象调用。简单来说,静态方法不需要重新建立一个实力化的类变量,然后在通过这个类,来应用类中的方法,这种是非静态方法。
2.Object中共有属性
2.1name
GameObject go;
Debug.Log(go.name);
Debug.Log(go.transform.name);
2.2 静态方法
2.2.1 Destroy:
2.2.2DestroyImmediate:
两者的区别在于使用Destroy方法,可以使物体销毁,即移除游戏物体,组件,或者资源。但是这个游戏物体依然暂时存在场景中,就像我问平时删除文件,文件只是暂时性的存放在回收站中,
DestoryImmediate:相当于强制性删除,可能导致空运行帧。不经过回收站这一步。一般情况下,使用Destroy即可;
Destory的使用方法
Destory(gameobject);
Destory(this);
Destory(rigidbody);
Destory(gameobject,5);
void Update(){
if(GetComponent<FooScript>())
{
Destroy(GetComponent<FooScript>());
}
}
2.2.3 DontDestroyOnLoad()
一般情况下,一个游戏物体在从场景A切换到场景B中,要被销毁,使用这个函数节点,可以使A场景中的游戏物体不被消费,保留到B场景中。
void Awake(){
DontDestoryOnLoad(transform.gameobject);
}
2.24FindObjectOfType和FindObjectsOfType
Light light = FindObjectOfType<Light>();
light.enabled = false;
还有在VS编译器中输入Find,会出现很多参考方法的选项,将鼠标悬停在那些方法上面,发现出现一些提示,内容中如果有否决的,说明这中方法在老版本中有,先在的版本弃用。
FindObjectsType<Transform>(); //场景中多个同类型物体时,可以通过这个函数调用。
Transform[] ts= FindObjectOfType<Transform>();//此函数不查找被禁用的对象。
foreach(Transform t in ts)
{
Debug.Log(t); //直接输出对象时,其实输出的是对象的一些属性,名字,类型等。
}
2.2.5 Instantiate
Find方法:根据游戏物体的名字查找,由于该方法是查找场景中所有的游戏物体,所以十分消耗性能,谨慎使用
FindWithTag:根据标签查找游戏物体(推荐使用)
FindGameObjectsWithTag:根据标签查找多个游戏物体,使用游戏物体数组接收。
10.GameObject,Component 和Object的关系
Destory可以销毁游戏物体或组件
Object.DontDestroyOnLoad:多用于场景切换的时候,不想销毁的游戏物体,可以不销毁,带到下一个场景中去 (也就是说用来设置一些共享的游戏物体)
09.如何禁用和启动一个游戏物体
1.游戏物体上的属性
transform:场景中的游戏物体中有一个组件是不能被移除的,那个物体时transform组件。每个游戏物体上都有一个transform组件;
tag:通过tag去区分一个游戏物体。
ActiveInHierarchy:这个物体在场景中是否被激活。如果一个游戏物体父物体被禁止激活状态,父物体的ActiveInHierarchy为false,子物体也会被禁用,它的ActiveInHierarchy也为false,在inspector面板中,它的ActiveSelf为true;
ActiveSelf:游戏物体自身的状态;
注意:一个游戏物体被禁用后,各种属性还是可以获取到的,只是它不在场景当中显示出来,它的脚本方法不在执行,不耗费性能,但是他们占用内存。
08.如何为游戏物体通过代码添加组件
GameObject go = CreatePrimitive(PrimitiveType.Plane);
go.AddComponent<Rigidbody>();
go.AddComponent<API02>();
07.创建游戏物体的三种方法
1.方法一:
New GameObject("cube");
GameObject go = new GameObject("Cube"); //new 是构建,构建出来的GameObject是一个空物体;
2.方法二
根据Prefab或者另外一个游戏物体实力化的。可以把场景中的Object做成Prefab。
GameObject.Instantiate(Prefab);//可以更加prefab和另外一个游戏物体克隆;
3。方法3
GameObject.CreatePrimitive(PrimitiveType.Plane)//创建一个初始的游戏物体,克隆出来了物体默认位置是原点位置。
1.游戏物体位移的方法
Translate(),方法是Transform中的方法,需要先定义一个Transform类型的变量,然后才能够使用此方法;
比如:Transform cube;
cube.translat(vector.Forward*Time.deltaTime);这样才能让物体运行的速度保持在1m/s;
2.测试两个方法是否耗性能
使用RealtimeSinceStartup;测试一个方法运算所消耗的时间。
int RunCount = 10000;
float time1=time.realtimeSinceStartup;
for(int i=0,i<=runcout;i++)
{
Method1();
}