Unity最新API总结(根据Siki老是的API课程总结而成)

来源:互联网 发布:js blob类型转base64 编辑:程序博客网 时间:2024/04/27 10:47

1.   Time

timeSinceLevelLoad:加载新场景所需的时间

frameCount:从游戏开始到现在一共运行了多少帧

unscaledTime:和realtimeSinceStarrup(游戏暂停也会继续计时)一样都是从游戏开始到现在运行的时间,但是它不受时间缩放的影响

deltaTime变化较大,做累加计时的时候容易直接越过限定的区域,而smoothDeltaTime比较平滑,可以用于限定一个时间区域

2.   创建游戏物体的三种方式

①  :创建空物体GameObject go=new GameObject(“Name”);

②  :Instantiate

③  :GameObject.CreatePrimitive(PrimitiveType.Plane);

  GameObject.CreatePrimitive(PrimitiveType.Cube);

3.   添加删除组件

GameObject go =GameObject.CreatePrimitive(PrimitiveType.Cylinder);

        go.AddComponent<Rigidbody>();//添加组件

       Destroy(go.GetComponent<Rigidbody>());//删除组件

4.   查找游戏物体上的组件(未激活的不会被查找)

Light light=FindObjectOfType<Light>();//查找到第一个游戏物体的类型之后直接返回该类型

Light[]light=FindObjectsOfType<Light>();//查找所有包含Light组件的游戏物体

5.   比较两个物体的标签是否一样

gameObject.CompareTag("Player");//返回True或者False

6.   游戏物体之间的消息交流

public GameObject Target;

 

void Start()

{

//广播消息

Target.BroadcastMessage("Attack", null,SendMessageOptions.DontRequireReceiver);

 }

Target自己或者子物体中只要有Attack函数(父(Target)子物体上的脚本可以不相同),将都会被调用一次;

 

void Start()

{

//广播消息

Target.SendMessageUpwards("AttacCube",null,SendMessageOptions.DontRequireReceiver);

 }

BroadcastMessage相反,Target自己或者父物体中只要有Attack函数(父子(Target)物体上的脚本可以不相同),将都会被调用一次;

void Start()

{

//发送消息

        Target.SendMessage("AttacCube",null, SendMessageOptions.DontRequireReceiver);

    }

         只有挂在Target上的脚本中的Attack函数才会被调用,即使其他Target子游戏物体有该函数也不会被调用

7.   Bool res = IsInvoking(“Attack”);判断一个Attack这个函数是否还在被调用

8.   当方法没有Update方法的时候,激活和不激活的勾选框将消失

9.   OnMouseUpAsButton();只有鼠标抬起的时候才会触发,但是当你在Cube上按下了鼠标,但是在鼠标按下的状态下移动鼠标到了Cube1上抬起了鼠标,那么这个函数将不会触发,也就是说该函数的抬起和按下必须是同一个游戏物体的时候才会有效。

10. Mathf.Rad2Dag*弧度;弧度转度数

Mathf.Dag2Rad*度数;度数转弧度

Mathf.Epsilon;最小最小的数字,仅仅比零大,符合以下原则

           anyValue+Epsilon=anyValue;

           anyValue-Epsilon=anyValue;

Mathf.Infinty;最最大的数,比任何数大

Mathf.NegativeInfinity;无限小的数

Mathf.Ceil;向上取整 exp:Mathf.Ceil(10.2);值为10  Mathf.Ceil(-10.2);值为-10

Mathf.Floor(10.0F);向下取整

Mathf.Clamp(Value,Min,Max,);Value的值被限制在Min和Max之间

Mathf.ClosestPowerOfTwo(3);用来该值最接近的那个2的多少次方的数字

Exp: Debug.Log(Mathf.ClosestPowerOfTwo(2));    //2

        Debug.Log(Mathf.ClosestPowerOfTwo(3));    //4

        Debug.Log(Mathf.ClosestPowerOfTwo(6));    //8

        Debug.Log(Mathf.ClosestPowerOfTwo(8));    //8

        Debug.Log(Mathf.ClosestPowerOfTwo(12));  //16

        Debug.Log(Mathf.ClosestPowerOfTwo(31));  //32

Mathf.DeltaAngle(1080,90);两个角度之间的最小距离,相当于:1080/360-90

Mathf.Max(10.5);取得两个的最大数

Mathf.Pow(6,2);6的2次方

Mathf.Sqrt(25);给25开平方

11. 差值运算

Mathf.Lerp(float a , float b , float t);

Exp: a=9,b=20,t=0,或者t=0.5或者t=1


当t的值大于1或者小于0的时候一直显示最大或者最小值Exp:t=-1 打印9.  t=3 打印20

//先快后慢,以比例的形式运动,刚开始a和b的距离大,比例始终是t,但是距离慢慢变小了,所以每帧移动的距离也就缩小了,所以先快后慢。

Exp: float x =Target.transform.position.x;

        float newX = Mathf.Lerp(x,10, Time.deltaTime);

     Target.transform.position= new Vector3(newX, 0, 0);

//匀速运动原理:x每帧都会加上Tiem.DeltaTime,直到到大10,一直显示10,不会超过

Exp:float x =Target.transform.position.x;

float newX = Mathf.MoveTowards(x, 10, Time.deltaTime);//-Time.deltaTime向反方向移动

     Target.transform.position= new Vector3(newX, 0, 0);

12. 协成

①:携程方法和普通方法的区别:

普通方法:如果执行的是一个普通方法,那么这个方法下面的方法会等这个普通方法执行完后,再继续向下执行。

携程方法:如果调用的是一个携程方法,那么开始调用这个携程方法后不会等这个方法执行完再向下执行,会继续向下执行,这个携程方法也会向下执行,这两个方法同步执行(注意:“总”方法比携程方法调用完的快)。

②:携程方法可以暂停

④  :StartCortine(方法名());开启一个携程方法

⑤  :返回值类型为IEnumerator

⑥  :返回参数的时候使用yield return null;

⑦  :停止携程的调用

Private IEnumerator ie;

Ie=Function();

StartCoroutine(ie);//开启

StopCoroutine(ie);//停止(使用StopCoroutine(“Function”);停止的时候开启的方法必须也是StartCoroutine(Function(“Function”))),一一对应。

13. [ExecuteInEditMode]

不用运行Unity,代码编译完后自动调用代码

14. PingPong

PingPong(float t, float length);

在0到length之间循环,t是循环的速度,当t=0,length=20的时候Debug.Log(PingPong(float t, float length));输出0,当t=5的时候输出5,当t=20的时候输出20,当t=22的时候输出18,又开始缩小,所以可以用Time.time作为t来使物体做PingPong运动。

15. Input

键的名字

Exp:         Input.GetKey("1");等价于Input.GetKey(KeyCode.Alpha1);

 

Normal keys: “a”, “b”, “c” …

Number keys: “1”, “2”, “3”, …

Arrow keys: “up”, “down”, “left”,“right”

Keypad keys: “[1]”, “[2]”, “[3]”,“[+]”, “[equals]”

Modifier keys: “right shift”,“left shift”, “right ctrl”, “left ctrl”, “right alt”, “left alt”, “right cmd”,“left cmd”

Mouse Buttons: “mouse 0”, “mouse1”, “mouse 2”, …

Joystick Buttons (from anyjoystick): “joystick button 0”, “joystick button 1”, “joystick button 2”, …

Joystick Buttons (from a specificjoystick): “joystick 1 button 0”, “joystick 1 button 1”, “joystick 2 button 0”,…

Special keys: “backspace”, “tab”,“return”, “escape”, “space”, “delete”, “enter”, “insert”, “home”, “end”, “pageup”, “page down”

Function keys: “f1”, “f2”, “f3”,…

 

 

16. Input.GetAxis("Horizontal"))

当按下A键的时候该值从0(什么都不按的时候一直输出0)渐变到-1(按到底),当手抬起的时候又从-1变到0,然后继续一直输出0(松开)。当按下D键的时候该值从0(什么都不按的时候一直输出0)渐变到1(按到底),当手抬起的时候又从1变到0,然后继续一直输出0(松开)。Input.GetAxis(“Vertical”); 的WS键同理。

Exp: Target.transform.Translate(Vector3.forward *Time.deltaTime * (Input.GetAxis("Horizontal")));//当按下D键的时候让Target先加速向前当抬起D键的时候减速到静止。

Input.GetAxisRaw("Horizontal");//没有缓冲的效果,按下A键直接到-1,一直按下一直输出-1,按下D键直接到1,一直按下一直输出1,松开一直输出0.

17. Input

Input.anyKeyDown; 当任何键按下的时候触发一次(true),包括鼠标的每个键

Input.anyKey; 当任何键按下的时候一直输出(true),包括鼠标的每个键

18. Vector2(结构体,不是类)

Vector2.one;//(1,1)

Vector3.one;//(1,1,1)

Vector2.magnitude;//计向量的长度

Vector2.SqrMagnitude(Vector2.one);//相当于1的平方加1的平方,没有开根号,比较两个向量长度的时候直接用没有开根号的去比较可以节约开根号的性能。

Vector2.one.x= Vector2.one[0]; Vector2.one.y= Vector2.one[1];

Vector2.Angle(V1,V2);//计算V1和V2的夹角

Target.transform.position =Vector3.MoveTowards(Target.transform.position, Vector3.one * 10,Time.deltaTime);//匀速移动到10,10,10

Vector2vector2 = new Vector2(2,2);

vector2.Normalize();//单位化vecotr2


19. Vector3

Vector3.Project(V1, V2);//V1在V2(单位向量,仅表示一个方向,无限长)的方向上做一个投影,返回一个与V2方向相同,一直到V1投影到V2上的点的一个向量。

 Vector3.Reflect(Vector3 inDirection, Vector3 inNormal);


20. Random随机数

Random.Range(float min, float max);//产生的随机数包括最小值不包括最大值,给min或者max加个F就可以产生小数了。

21. Random.value

随机产生0-1之间的一个小数,包括0和1都在内

Exp: 随机产生一个颜色,RGB的值都在0-1之间

22. Random.state

获取种子(下面的T)的值是多少

23. Random.InitStante(int T);//在Start方法中调用此方法,只要T的值不变下次产生的随机数和上次的相同,换到不同的电脑上值也相同,一个T值代表一串随机数,所以当T随机产生的时候范围内产生的随机数也就是随机的T的随机可以使用(int)System.DateTime.Now.Ticks;来实现,这是时间戳,时间永远不会重复

 

Exp: voidStart()

               {

                Random.InitState(0);

                   }

              void Update()

                 {

                 if (Input.GetKeyDown(KeyCode.Space))

                    {

               Debug.Log(Random.Range(3, 10));

                 }

         }

T的值为0,所以当按下空格键的时候每次按下产生一个随机数,这一串随机数(个数无限)的值不会变化,该值为3,6,8,8,7,4,按下第七次的时候再次输出3,第八次6,依次循环,只要T为0且区间为3到10,每个机器上输出的都是以上结果。

24. Random.rotation

随机得到一个四元数,物体的随机朝向可以实现,比如巡逻的时候随机转头

25. Random.insideUnitCircle

在半径为1的圆内随机产生一个二维的坐标,比如随机产生敌人的位置的时候,但Z不变

Random.insideUnitCircle*5表示半径为5的圆内

26. Random.insideUnitSphere

在半径为1的球内随机产生一个位置,Z也变

27. System.DateTime.Now

获取当前时间,格式为:8/31/20176:12:26 PM

28. 四元数Quaternion(结构体)

注意:X,Z轴是围绕着自己的轴旋转的,转动Y轴的数据的时候是按照世界坐标的Y轴旋转的,只有当X和Z的旋转都是0的时候Y轴才是围绕着自己转动的

①  :Quaternion.LookRotation(vector);//看向vector的正前方,vector可以用敌人的坐标减去玩家的左边,就可以得到从玩家的位置出发到敌人位置为终点的一个向量,该向量的单位向量就是玩家看向敌人的单位向量,即vector

②  Quaternion.Slerp(Quaternion a,Quaternion b,floatt);

Exp:玩家转向看向敌人

public Transformplayer;

        public Transform enemy;

    void Start()

    {

 

    }

    void Update()

    {

              Vector3 vector =(enemy.position - player.position).normalized;

                     Vector.y=0;

              Quaternion target = Quaternion.LookRotation(vector);

player.rotation =Quaternion.Slerp(player.rotation, target, Time.deltaTime);//缓慢转向

//player.rotation=Quaternion.LookRotation(vector);//快速转向

}

注意:Slerp比较平滑,Lerp不是很平滑,所以角度的旋转尽量选择Slerp,其他位置之类的变化使用Lerp

29. Rigidbody(刚体)

①  通过刚体控制物体的运动比通过Transform去控制物体运动性能更优(不推荐直接去改变位置Rigidbody.position达到位移的效果,要达到瞬间移动的话可以使用Rigidbody.position,要匀速运动推荐使用MovePosition去移动)。

②  给玩家添加一个力,Force就是这个力的大小,比如汽车加速的时候可以让Force增大,以达到加速的效果,力会使物体做加速运动,到一定的速度就不在加速了。

Public GameObject Player;

Public float Force;//

Rigidbody.AddForce(Vector3.forward*Force);//让物体在一个Force大小的力下沿着forward方向加速前进

30. Camera

射线检测

void Update()

     {

            Rayray = Camera.main.ScreenPointToRay(Input.mousePosition);

              Debug.DrawRay(ray.origin, ray.direction *1000, Color.red);

        }

31. Application(在playerSettings中基本上都能找到相应的设置)

StreamingAssets:(流资源)

资源文件,比如AssteBundle,声音,视频等可以放在StreamingAssets文件夹下面(在Assets文件夹下面新建StreamingAssets文件夹),该文件夹中的东西不会被打包成Unity的格式,该文件夹中的文件格式保持不变,路径也不变。

①  :Path:

1.      dataPath:工程数据的路径(F:/UnityProject/SikiAPI/Assets)

2.      streamingAssetsPath:可以通过文件流来读取的数据(F:/UnityProject/SikiAPI/Assets/StreamingAssets)

3.      persistentDataPath:可以持久化的数据(C:/Users/Administrator/AppData/LocalLow/DefaultCompany/SikiAPI)

4.      temporaryCachePath:临时的数据

(C:/Users/ADMINI~1/AppData/Local/Temp/DefaultCompany/SikiAPI)

可以通过1或者2来获取当前_Date文件夹所在的位置,然后将截图等等保存在2的路径下,使文件夹的格式不变,方便查看。(StreamingAssets文件夹下的文件格式不会被打包,显示原来的格式)

②  :

Application.companyName;公司的名字(Read Only)

Application.runInBackground;是否在后台运行

Application.productName;产品的名字(Read Only)

Application.identifier;标识,默认的是com.Company.ProductName

Application.isFocused;判断当前项目是否是焦点(比如同时打开了浏览器,unity,unreal4,当鼠标点击unreal4的时候unreal4在最上面,其他两个都在后面,此时unreal4就是当前屏幕的焦点);

Application.isMobilePlatform;判断当前是否在移动平台上运行(android,ios等)。

Application.platform;判断当前运行在哪个平台上

Exp:if(Application.platform==RuntimePlatform.WindownsPlayer)

                   Debug.Log(“isWindownsPlayer”);

                  Application.OpenURL(“http://unity3d.com/”);打开一个网址

                   Application.CaptureScreenshot(“路径”+“ScreenShot.png”);//屏幕截图

                            Unity2017中上一个方法已经被弃用,采用以下方法:

string path = Application.streamingAssetsPath;

                     ScreenCapture.CaptureScreenshot(path+ "/ScreenShot.png");

Application.isPlaying;游戏是否运行

UnityEditor.EditorApplication.isPlaying=false;//设置为false之后可以在Unity编辑器中退出游戏


新手,各位大佬多多指教。

原创粉丝点击