【unity本站最全系列】unity常用API大全一篇文章足以(万字详解)不信你不收藏

简介: 【unity本站最全系列】unity常用API大全一篇文章足以(万字详解)不信你不收藏

在这里插入图片描述


👨‍💻个人主页@元宇宙-秩沅

**hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!**

本文由 秩沅 原创

收录于专栏 unity 实战系列
在这里插入图片描述


⭐相关文章⭐

在这里插入图片描述

-本站最全-unity常用API大全(万字详解),不信你不收藏

-关于游戏剧情模式中用到的基础简单API

-控制游戏人物移动的细节到底有多少?

-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)

-基于unity物体定点移动与模拟刹车的细节 GIF 图文详解


反射机制


场景的本质-配置文件-(场景类型文件右键通过记事本可以看到)


API——Inspector可编辑变量+辅助特性


可视化去编辑脚本的变量、
在这里插入图片描述

☑️辅助特性:

  • ==字典 自定义类型 私有和被保护类型无法在Inspector面板上显示==
  • ==【serializeField】==——将私有类型和保护类型可视化到面板上
  • ==【System.serializeField】==——将自定义类型可视化到面板上
  • ==【HideIninspector】==——将公共变量隐藏
  • ==【Header(“分组说明”)】==——将可视化变量进行分组
  • ==【Tooltip(“内容说明”)】==——鼠标移动变量处时显示说明信息
  • ==【Range(最小值,最大值)】==——通过拖动条的方式来控制范围
  • ==【contextMenuItem(”变量名x“,"变量的方法名")】==——停在可视化变量上时显示方法,并可以点击调用--方法需要无参无返回
  • ==【contextMenu(”测试函数名")】==——只为调式,右键选择方法执行
  • ==【Multline(x)】==——将字符串设置可见的x行
  • ==【TextArea(3,4))】==——添加滚动条来查看设置的文本区
    +==【DisallowMultipleComponent】==-不让挂载多重脚本

API——坐标系


①世界坐标系——transform.......
②物体坐标系——transform.Local.....
③屏幕坐标系
④视口坐标系——用的较少,主要调整窗口

坐标转换

在这里插入图片描述


API——生命函数


在这里插入图片描述

  • 👨‍💻==十大常见的生命函数==

👨‍💻Reset()://重置函数,


调用情况和时间:
编译器不运行的情况下 和 使用脚本组件Reset功能的时候, 挂脚本的时候

调用次数: 1次


👨‍💻 Awake(); //苏醒函数


调用情况和时间:

1.点击运行的时候

2.组件从失灵到激活的时候,但只调用一次

3.Instantiate方法调用的时候

调用次数: 1次


👨‍💻OnEnable(); //组件调用函数


调用情况和时间: 组件从失灵到激活的时候,可多次实现

调用次数:只要组件有失灵到激活的状态就可调用 ,


👨‍💻Strat():


调用情况和时间: 当游戏物体被激活,或者脚本组件被激活时调用 , (点击运行的时候也是会被激活)

调用次数: 1次


👨‍💻FixedUpdate(每帧)


==一般用作物理更新==

调用情况和时间: FixedUpdate一般适用在相关物理引擎中。它的频 率是0.02秒,是固定的。

调用次数: 大概每秒50次左右、

FixedUpdate & Update & LateUpdate的 区别详解


👨‍💻UpData(每帧) ;


==一般用作游戏逻辑更新== update取决于电脑显卡的性能,好的话,快,不行的话就慢,所以相比Fixed Update它具有随机性。

调用情况和时间: 在以上生命周期函数之后,每帧调用一次

调用次数: 大概每秒60次左右

==变量赋值生效顺序:==

变量声明直接赋值 > 检视面板赋值 > Awake > Enable > 外部赋值 > Start


👨‍💻LateUpate(每帧):


==一般用作相机更新== 它的执行顺序在update的后面,一般适用于相机的跟随,物体运动在update中,相机跟随在LateUpdate,这样会减少误差,避免出现不必要的瑕疵。

调用情况和时间: 在Update调用之后,并且也是每秒60帧左右(适用于物体移动后的视角跟随)

调用次数: 大概每秒60次左右


👨‍💻OnGUI(每帧)


  • 它一般与界面化,渲染,UI等有关,实时执行,比如想在幕布上弄个按钮button

👨‍💻OnDisable():


调用情况和时间: 和OnEnable差不多,但是Disable是组件从完好到失活的状态, (相当于关闭组件的时候)

调用次数: 组件从激活到失灵的时候调用(二者前提是在游戏运行的时候)


👨‍💻OnApplicationQuit()


调用情况和时间: 当所有游戏物体退出时调用,适用于打包的时候

调用次数: 满足以上情况便调用


👨‍💻OnDestroy();


调用情况和时间: 适用于物体的销毁,删除,以及游戏的停止退出时

调用次数: 满足以上情况便调用


👨‍💻总的执行顺序为:


  • awake——OnEnable——start——FixedUpdate——Update——LateUpdate——OnGUI——DIsEnabel——OnDestory

API 之——创建,获取和失灵


👨‍💻👍1.创建物体的三种方式


1.new 构造函数
2.instantiate 实例化方法
3.Gameobject .CreatPrimtive(Primitve Type.cube);使用特别的API创建一些基本的游戏物体类型(原始几何体)


👨‍💻👍2.游戏物体的获取和查找


if(this.TryGetComponent<>( out 脚本名) )
{
//获取到了就进行处理
}

  • ==获取==
  • 1.this
  • 2.获取游戏物体的标签 gameObject.tag
  • 3.获取游戏物体的名字 gameObject.name
  • 4.获取游戏物体的层级 gameObject.layer

1.子对象的获取

  • 1.transform.Getchild(序列号);
  • 2.transform.GetsiblingIndex() -----获取同级索引(查找自已是父亲的第几个儿子)
  • 3.transform.GetComponentInChildren< Transform>(序列号);

2.父对象的获取

  • 1.transform.parent();

3.Project的资源获取--资源加载

  • Resources.Load< GameObject>("资源路径")

==查找物体==

  • 1.GameObject,Find()-----按照名字查找游戏对象 ,用太多会降低性能
  • find的本质——单例模式的升级版 + 服务定位器 (若代码较为复杂的话性能消耗较大)

  • 2.GameObject,FindobjectType<>();------按照组件名来查找游戏物体
  • 3.GameObject.FindGameObjectwithTag()------按照游戏物体标签来查找游戏物体
  • 4.多数查找与获取
  • 在这里插入图片描述
        GameObject[] enemyGos= GameObject.FindGameObjectsWithTag("Enemy");
        for (int i = 0; i < enemyGos.Length; i++)
        {
   
   
            Debug.Log("查找到的敌人游戏物体名称是:"+enemyGos[i].name);
        }

==失灵==

  • 1.xx.SetActive(false); --------应用于游戏物体xx为GameObject类型继承自Object类
    使得相应的游戏物体失灵
  • 2.xx.enable = fasle;-----------应用于游戏物体的组件xx为组件的类型,继承为Copment类
    使得相应游戏物体的组件失灵


    👨‍💻👍3.继承


常见类的继承关系:

自己创建的类 -> MonoBehavair->Behavir->Conpment->Object


API 之——transform组件篇


👨‍💻👍1.transform的各种引用


==transform.position== ----游戏物体trans组件的世界位置信息
==transform.Rotation==----游戏物体的四元旋转信息
==transform.enlerAugle==- ---游戏物体的欧拉角的信息(也就是Inspactor面板中的Rotation信息)
==transform.localposition==/localRotion/localenleAugle--------表自身的自身信息


👨‍💻👍2.游戏物体的自身方向和世界轴方向


针对自身:
==transform.forword ==----向前Z轴方向
==transform.up==------向上y轴方向
==transform.right==----向右x轴方向
针对世界:
vector.XX...
针对看向:
==transform.LookAt(某个方向)==——一直看向某个方向
==transform.LookAt(某个物体)==——一直看向某个物体


👨‍💻👍3.用transform组件来进行查找(包含索引查找)


Debug.Log("被创造的游戏物体的世界坐标位置是"+xx.transform.position);
Debug.Log("当前transform组件挂载的游戏物体对象的名字是"+transform.name);
Debug.Log("当前transform组件挂载的游戏对象的子对象的数量"+transform.childCount);
Debug.Log("当前游戏物体的世界四元旋转值为"+transform.rotation);
Debug.Log("当前游戏物体的自身大小为"+transform.localScale);
Debug.Log("当前游戏物体的自身位置为" + transform.localPosition);
Debug.Log("当前游戏物体的自身四元旋转位置为"+transform.localRotation);
Debug.Log("当前游戏物体的世界欧拉角为"+transform.eulerAngles);
Debug.Log("当前游戏物体的自身欧拉角为"+transform.localEulerAngles);
Debug.Log("查找当前游戏物体的子对象的trans组件名称为" + transform.Find("sboss"));
Debug.Log("查找当前游戏物体的第一个子对象为" + transform.GetChild(0));
Debug.Log("查找该游戏物体在父类中子对象的索引位置" + transform.GetSiblingIndex());


API 之--Vector实质


👨‍💻👍1.Vector2结构体的静态变量


1.Vector2.up // 以下的形式pint之后是 (X,y)
2.Vector2.down
3.Vector2.Left
4.Vector2,Riht
5.Vector2.one //单位化之后的值
6.Vetor2.zero // 原点的值


👨‍💻👍2.Vector2 结构体的成员变量


1.x
2.y
3.XX.normalized //返回 单位化的值
4XX.magnitude //返回该向量的模长
5.XX.sqrMagnitude //返回该向量 模长的平方
''''''''''''


👨‍💻👍3.索引器的格式和存在的目的


1,格式
访问修饰符 + 数据类型+ this [ 索引类型 index]
{
get
set
}
在这里插入图片描述

2.目的:

简化结构体或者类成员的引用 (简化代码),可向数组用下标那样调用成员


👨‍💻👍4.Vector2的公共函数-Equrls()


Equrls(); // 比较两个向量是否相等
用法 : XX1 . Equals( XX2 );


👨‍💻👍5,Vector2的静态方法


  • 1.vector2.Angle(); 返回两个向量的夹角
  • 2.vevtor2.Distance(): 返回两个点(向量)的距离
  • 3.Vetor2.Lerp(a , b, t) ;返回两个向量的差值 (二维向量线性差值)
  • 4.Vecor.LerpUnclamped(a,b,t) ; 在 a 与 b 之间按 t 进行线性插值,t 没有限制。

  • 5.Vector2.MoveTowards(a , b,t): t为限制向量的移动步频(可以理解为规定速度移动)、

  • 6.vector2.max();

  • 7.vector2.min();
  • 8.vecotr2.smoothDamp(a,b,v ,t);平滑阻尼,可理解为汽车刹车效果,v为速度是二维向量,t为平滑时间

在这里插入图片描述


API 之--MathF类


👨‍💻👍1,MathF类的静态变量

Math和MathF的区别:mathf是unity封装的类它在基于math数学类的基础上添加了适合unity游相关的方法

强制类型转换和向下取整&向下取整:除去c#中常用的三个强转 ---ceilToInt() 和 FloorInt()

钳制函数MathF.clamp()

Mathf.sigh()-判断正负

Mathf.MoveTowords()——无限接近但不完全相等


👨‍💻👍1,MathF类的静态变量


  • print(Mathf.Deg2Rad+",度到弧度换算常量");
    • print(Mathf.Rad2Deg+ ",弧度到度换算常量");
    • print(Mathf.Infinity+"正无穷大的表示形式");
    • print(Mathf.NegativeInfinity + "负无穷大的表示形式");
    • print(Mathf.PI);

👨‍💻👍2,MathF类的静态函数


  • print(Mathf.Abs(-1.2f)+ ",-1.2的绝对值");
  • print(Mathf.Acos(1)+",1(以弧度为单位)的反余弦");
  • print(Mathf.Floor(2.74f)+",小于或等于2.74的最大整数");
  • print(Mathf.FloorToInt(2.74f)+",小于或等于2.74的最大整数");

  • print(Mathf.Lerp(1,2,0.5f)+",a和b按参数t进行线性插值");

  • print(Mathf.LerpUnclamped(1, 2, -0.5f) + ",a和b按参数t进行线性插值");

👨‍💻👍3,MathF类中的 倒计时 函数


==Math.MoveTowards()==

   void Update()
    {
    
    
        print("游戏倒计时:" + endTime);
        endTime = Mathf.MoveTowards(endTime,0,0.1f); //每次减0.01 直到endTime为0     
    }

API 之--向量



👨‍💻👍常用


  • [x] 向量之间的距离 ——Vector3.Disrtance() 向量 和向量之间相减 A - B
  • [x] 0向量——Vector.zero()
  • [x] 向量模长——Vector3.magnitude() 相等于向量之间的距离
  • [x] 单位向量——Vector3.normalized()适用于物体移动的时候的单位化计算
  • [x] 向量+向量 和向量+位置 的区别——前者为向量(高数中的向量相加)后者为相当于扩大作用结果是位置
  • [x] 位置-位置的几何意义——结果为向量 ,向量-向量 = 向量
  • [x] 向量的加减乘除——加减应用于物体平移 乘除的进行缩放要用本地坐标

API 之--随机类


👨‍💻👍1,随机类的静态变量


  • 随机数int和float
    Random.range()://int是左闭右开,float是左闭右闭

  • ①随机出旋转数
    Random.rotantion

  • ②随机出的欧拉角
    Random.rotation.enluarAngles
  • ③随机出的欧拉角转四元数
    Quteronion.luer.( Random.rotation.enluarAngles)
  • ④随机出的浮点数
    Random.Vauler 范围是 【0,1)
  • ⑤按图形随机出数字 --应用于枪口的圆形子弹发射(FPS)
    Random. insideUnitCircle

    在(-1,-1)~(1,1)范围内随机生成的一个vector2")


👨‍💻👍2.随机类的静态函数


  • ①范围内的随机数
    Random.range(0 ,4 ) 左闭右开->[ 0 , 4 )
    Random.range( 0, 4f ) 左闭右闭 -> [ 0 ,4 ]
  • ②伪随机数设置状态
    Random.InitState(1) 开启状态
  • ③伪随机数
    Random.range( 0 , 4 ) 左闭右闭 -> [ 0 , 4 ]

API 之--MonoBehavior类


在这里插入图片描述

  • 🧠transform.enable()+transform.Active
  • 🧠xx.GetComponent<>()泛型获取
  • 🧠XX.GetComponent() as XX
  • 🧠XX.GetComponent(Typeof()) as XX Typey类型获取
  • 🧠gameObject.name
  • 🧠 new 脚本类型 [ ] yy / yy = this.GetComponents();//得到多个脚本
  • 🧠 getComponentInChrild/Parent //子对象或父对象组件的获取
  • 🧠==更安全的获取脚本==TryGetComponent<>();

    👨‍💻👍1,鼠标回调事件函数


  • 适用于界面操作

private void OnMouseDown()
{
print("在挂载的物体身上按下了鼠标");
}

private void OnMouseUp()
{
print("在挂载的物体身上按下的鼠标抬起了");
}

private void OnMouseDrag()
{
print("在挂载的物体身上用鼠标进行了拖拽操作");
}

private void OnMouseEnter()
{
print("鼠标移入了挂载的物体");
}

private void OnMouseExit()
{
print("鼠标移出了挂载的物体");
}

private void OnMouseOver()
{
print("鼠标悬停在了挂载的物体上方");
}

private void OnMouseUpAsButton()
{
print("鼠标在挂载的物体身上松开了");
}


API 之—— Input系统接口类


👨‍💻👍0,相关


  • 输入相关的内容一定是哟啊写在Update里面
  • 长按和点按的区别在于有没有Dwon和Up
  • 按任意键继续 -- ==Input.AllKey()==
  • 得到输入的是哪个键(Stirng)-==Inpout.inputString()==
  • 得到鼠标的位置——==Input.MousePosition()==
    +==GetAxis 和 GetAxisRaw 的区别== ——后者返回的只有三个值 -1 0 1

👨‍💻👍1,连续检测(按键,鼠标)


  • print("当前玩家输入的水平方向的轴值是:"+==Input.GetAxis("Horizontal")==);
    • print("当前玩家输入的垂直方向的轴值是:" + ==Input.GetAxis("Vertical")==);
    • print("当前玩家输入的水平方向的边界轴值是:" + ==Input.GetAxisRaw("Horizontal")==);
    • print("当前玩家输入的垂直方向的边界轴值是:" + ==Input.GetAxisRaw("Vertical"))==;
    • print("当前玩家鼠标水平移动增量是:"+==Input.GetAxis("Mouse X"))==;
    • print("当前玩家鼠标垂直移动增量是:" +==Input.GetAxis("Mouse Y"));==
    • 鼠标的某一个键按下 ——==Input.GetMouseButtonDown( 0/1/2)==
    • 得到鼠标的位置——==Input.GetMousePosition()==——起点在屏幕左下角
    • 鼠标的滚动——==Input.MouseScrollDeltta()==——改变Y轴的值
    • 鼠标滚动的应用-------炮管的升降

👨‍💻👍2.连续检测(事件)


手柄相关

  • 得到所有按钮的名字 ——==Input.GetJoystickNameS()==
  • if (==Input.GetButton("Fire1")==)

      {
          print("当前玩家正在使用武器1进行攻击!");
      }
    
  • if (==Input.GetButton("Fire2")==)

      {
          print("当前玩家正在使用武器2进行攻击!");
      }
    
  • if ==(Input.GetButton("RecoverSkill")==)

      {
          print("当前玩家使用了恢复技能回血!");
      }
    

👨‍💻👍3.间隔检测(事件)


  • if (==Input.GetButtonDown("Jump")==)

     {
         print("当前玩家按下跳跃键");
     }
    
  • if (==Input.GetButtonUp("Squat")==)

      {
          print("当前玩家松开蹲下建");
      }
    
  • if (==Input.GetKeyDown(KeyCode.Q)==)

     {
         print("当前玩家按下Q键");
     }
    
  • if (==Input.anyKeyDown==)

     {
         print("当前玩家按下了任意一个按键,游戏开始");
     }
    
  • if (==Input.GetMouseButton(0)==)

    {
        print("当前玩家按住鼠标左键");
    }
    
  • if (==Input.GetMouseButtonDown(1)==)

      {
          print("当前玩家按下鼠标右键");
      }
    
  • if (==Input.GetMouseButtonUp(2)==)

     {
         print("当前玩家抬起鼠标中键(从按下状态松开滚轮)");
     }
    

---

API —— SendMessage消息发送机制


玩玩demo可以,实际开发是几乎不能用的。

在这里插入图片描述
👍仅发送消息给自己(以及身上的其他MonoBehaviour对象)

gameObject.SendMessage("GetMsg");
SendMessage("GetSrcMsg","BOSS");
SendMessage("GetTestMsg",SendMessageOptions.DontRequireReceiver);

👍广播消息(向下发,所有子对象包括自己)

BroadcastMessage("GetMsg");

👍向上发送消息(父对象包含自己)

SendMessageUpwards("GetMsg");

  • public void GetMsg()
    {
    print("测试对象本身接收到消息了");
    
    }
  • public void GetSrcMsg(string str)
    {
    print("测试对象本身接收到的消息为:"+str);
    }

API——动画基础


  • 1,ipg -> UI and 2D
          (  直接将图集进行拖拽给对象) 变成动画
    
  • 2,代码更改速度
                animator .speed 
    
  • 3,代码实现动画的播放
                  animator.dispaly
    
  • 4,代码设置过度参数
     animator.Setfloat("Speed", 1 )
    
  • 5,代码实现动画的过度

情况一:
通过按键进行动画的播放
情况二:
和通过参数来进行动画的切换(取消勾选 Has Exit Time)

以标准单位化时间进行淡入淡出效果来播放动画

animator.CrossFade ("Walk" , 0.1f) __值越小过渡的越快

以秒为单位进行淡入淡出效果来播放动画

animator.CrossFadeInFixedTime("Run", 0.5f);


API——时间Time类


👨‍💻👍1.成员变量


  • Time.deltaTime ",
    完成上一帧所用的时间(以秒为单位
  • Time.fixedDeltaTime
    执行物理或者其他固定帧率更新的时间间隔",fixedDeltatime是一个固定的时间增量。==Unity中默认fixeddeltaTime为0.02秒,但FixedUpdate并不是真的就0.02秒调用一次==

以下的总时间并不精确,适用于对时间精确不是特别严格的情况

  • Time.fixedTime + ",表示FixedUpdate(生命周期)已经执行的时间,可以作为自游戏启动以来的总时间(以物理或者其他固定帧率更新的时间间隔累计计算的),基本上是以0.02慢慢累加(有误差)
  • Time.time + ",游戏开始以来的总时间、

    精确时间

  • Time.time + ",游戏开始以来的总时间"

  • Time.realtimeSinceStartup + ",游戏开始以来的实际时间"

  • Time.smoothDeltaTime + ",经过平滑处理的Time.deltaTime的时间

  • Time.timeSinceLevelLoad + ",自加载上一个关卡以来的时间(进入了新场景后的时间)


👨‍💻👍慢动作功能 ---时间成员变量


  • ime.timeScale

时间流逝的标度,可以用来慢放动作、它的默认值为1,为0.5时可将当前游戏程序中所有时间放慢到原来的0.5倍,若为3 则为原来的三倍

Time.timeScale = 3;


API——协程

---

👨‍💻👍1.协程的定义和用途


协程顾名思义,协同程序

+ 用法和用途

1.延时调用

如果有很多敌人,那么每帧都调用此函数可能会带来很大开销。但是,可以使用协程,每十分之一秒调用一次

协程的定义:

 IEnumerator ChangeState()  //协程迭代器的定义
    {
    
    
        //暂停几秒(协程挂起)
        yield return new WaitForSeconds(2);
        //暂停两秒后再切入走路的动画
        animator.Play("Walk");`    
   }

2.和其他逻辑一起协同执行
,比如一些很耗时的工作,在这个协程中执行异步操作,比如下载文件,加载文件,异步生成怪物等

*资源加载一般是一个比较耗时的操作,如果直接放在主线程中会导致游戏卡顿,通常会放到异步线程中去执行。
在这里插入图片描述


👨‍💻👍2.协程的启动和停止


void start()
{
   
   
启动方法一:
StartCoroutine("ChangeState"); //括号内的是协程名
启动方法二:
StartCoroutine(ChangeState());
启动方法三:                   //有参协程只能用该方法开启
IEnumerator ie = ChangeState();
StartCoroutine(ie);

协程停止方法
StopCoroutine("ChangeState");
StopCoroutine(ChangeState());
StopCoroutine(ie);
停止所有协程:
StopAllCoroutines();
}


IEnumerator ChangeState()  //协程的定义
    {
   
   
        //暂停几秒(协程挂起)
        yield return new WaitForSeconds(2);
        //暂停两秒后再切入走路的动画
        animator.Play("Walk");`    
   }

👨‍💻👍3.协程中的 yield


表示等待一帧

  • yield return n ==【n可以是任意数字或者 null】==
    表示等待n秒
  • yield return new WaitForSeconds(n);
    ==【n可以是任意数字】==
    表示在本帧帧末执行以下逻辑
  • yield return new WaitForEndOfFrame();
    IEnumerator ChangeState()
     {
          
          
         //等待一帧 yield return n(n是任意数字)
         yield return null;
         yield return 100000;
         print("转换成Run状态了");
         //在本帧帧末执行以下逻辑
         yield return new WaitForEndOfFrame();
     }
    

👨‍💻👍4.协程中的协程和有参协程


    StartCoroutine("CreateBoss");  //启动协程

  //协程1 功能实时实例化游戏物体 
 IEnumerator CreateBoss()   
    {
   
   
        StartCoroutine(SetCreateCount(5));
        while (true) //功能实时实例化游戏物体
        {
   
   
            if (BossNum>=BossCount)
            {
   
   
             yield break; //在协程中break前面要加 yield
            }
            Instantiate(animator.gameObject);
            BossNum++;
            yield return new WaitForSeconds(2);
        }
    }

 //协程2 功能实时实例化游戏物体  
 IEnumerator SetCreateCount(int num) 
    {
   
   
        BossCount =num;
        yield return null; //暂停一帧
---------------------
此时如果这里只是暂停一帧的话,
那么上面调该有参协程的协程体中,
后面的语句并未生效,因为暂停一帧后,
后面的方法已经执行了,
所以此时的BossCount并不等于有参传递的5
(当然BossCount是全局变量)
---------------------
    }
IEnumerator SetCreateCount(int num)
{
    grisCount =num;
    yield return null;
}

}


API——invoke延时调用


👨‍💻👍1.延时调用


● Invoke(“名字”,秒数)
● InvokeRepeating(“名字”,第一次秒数,之后每次调用间隔秒数)

  • 使用协程的延时调用也可以
  • 使用计时器-MathF.MoveTowords也可以达到延时调用的效果
    ```csharp
    void Start()
    {
      //调用
      //Invoke("CreateGris",3);
      InvokeRepeating("CreateGris",1,1);
    
    }
    private void CreateGris()
    {
      Instantiate(grisGo); //实例化
    
    }

---
 👨‍💻👍2.取消调用

---
● CancelInvoke(“方法名”);暂停当前延时调用该方法
● CancelInvoke();停止所有的延时调用方法

---
👨‍💻👍3.判断是否调用

---
● IsInvoke(“方法名”);判断当前方法是否进行了延时调用
● IsInvoke();停止程序中所有的延时调用

---
👨‍💻👍4,让方法只调用一次的方法

---

+ **改变其判断的条件法**:首先让其=ture 才进行,然后调用一次之后就变成 false,或者前面是==某个数值,后面就改变它的值
+

---

# API——物体的移动
---
👨‍💻👍1.常用使物体移动的方法

---

+ 1,movetowords 和线性差值进行两点间的移动

+ 2,transform.position (利用监听键盘进行实时的位置变化移动)

+ 3,通过刚体进行单向移动(xx.MovePosition)

+ 4,通过刚体的力进行牵引移动 xx.addForce( vector2.方向) 
  **有两个参数的情况**
   xx.addForce( vector2.方向,ForceMode2D.force 或者 Impuse)
> impuse是爆发的瞬时的,应用于爆炸情景
Force则是连续的,,相当于没有第二个参数

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/0821fdcd83f84dce8b6b65459ec0df8e.png)

+ 5,通过刚体速度进行移动 因为刚体速度是有大小和方向的
+ 6,Transform.Translate(方向)/Transform.Translate(方向,世界轴/自身轴)
 (物体朝某一个方向移动的方法)

| 方法    |   描述      |
|:------------:| :-------------:|
| Transform.Translate(Vector2.left) |世界坐标方向 |
| Transform.Translate(transform.left) |自身坐标方向 |
| Transform.Translate(Vector2.left,Space.World) | 世界坐标方向 |
| Transform.Translate(Vector2.left, Space.Self) | 自身坐标方向 |
| Transform.Translate(transform.left ,Space.Self/World) | 自身坐标方向 |


---
👨‍💻👍2.细节

---

1.物理系统相关的API要放进去FixedUpDate
2,受重力影响的程度 gravity Scale
3,阻力 0Linear Drag 线性阻力

---

# API——物体的旋转
---
👨‍💻👍常用使物体旋转的方法

---
+ 通过刚体让物体的旋转( 2D平面用好点)
>xx.MoveRotation(角度)
>**XX.MoveRotationReapting( xx.Rotation +角度 * Time,DeleTime )**
>此时的Rotion并不是四元数 ,在这里就是当前物体的度数

+ transform组件让物体绕轴旋转(3D立体用好点)
>transform.rotate( new vector3( 0 , Y ,0) );  按Y轴旋转
>transform.rotate( vector2.forword ,Space.Self/World) ; 按z轴旋转


---
# API——音频Audio

---
👨‍💻👍常用操作

---
+ 获取音频资源组件 : **AudioSource = GetComponent< AudioSource>();**
+ 获取音频: **Public AudioClip xx ;   AudioSouce.Clip = xx**  ==Clip译“片段”==
+ 音量设置:**AudioSource.Volum =**
+ 开始播放的时间设置:**AudioSource.time =**
+ 静音: **AudioSource.mute = true;**
+ 播放: **AudioSource.Paly( )**
+ 暂停:**AudioSource.pause( )**
+ 恢复播放:**AudioSource.UnPause( )**
+ 停止:**AudioSource.Stop( )**
+ 播放一次音效: **AudioSource.PlayOneShot(AudioClip)** 
+ 音量近大远小方法设置:
**AuodioSource.PlayClipAtPoint( AudioClip,transform.positon)**
==[ 音频片段AudioClip 距离物体位置越近声音越大]==
---
👨‍💻👍AudioSourse组件介绍

---

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/255c5e41d54b47769d6140a6a934d608.jpe![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/84c27b16af424976937e2669f5f6f202.png)![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/485c2322e08d48edb35fb35928b3bda2.png)
>**Play On Awake 第一次调用就开启
Loop  循环
Pitch  音调**

---
# API——碰撞器和触发器
---
👨‍💻👍碰撞器

---
+ onCollisionEnter( coliision2D xx )     当物体进入到本身的碰撞区时触发
+ onCollisionStay( collision2D xx )      当物体呆在本身的碰撞区域时触发
+ onColiisionExit( collision2D xx  )      当物体离开 本身的碰撞区域时触发

---
👨‍💻👍触发器

---
>触发器是碰撞器中的一部分 开启与否 直接按碰撞器组件上的触发器开关即可
- [x] is Trigger

+ onTiggerEnter ( collision2D xx )      当物体进入到本身的碰撞区时触发
+ onTriggerStay( collision2D xx )       当物体呆在本身的碰撞区域时触发
+ onTriggerExit( colidion2D xx )        当物体离开 本身的碰撞区域时触发

+ ✌️**种类**

box,胶囊,球形,车轮,网格,地形
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/b9b6a20d218f4fa2ae683b5aee3a1d88.png)
+ ✌️**物理材质**
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/6e852dedd24246c4a7f11451cf4287ed.png)

+ ✌️**碰撞函数**

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/8eb01cadc1924c228ceff6d3906bdfb9.png)

---
# API——资源加载(Resource)
---
👨‍💻👍5种资源加载的方式,Resource加载介绍

---
+ **Resources(只能加载Resources目录中的资源)**
+ AssetBundle(只能加载AB资源,当前设备允许访问的路径都可以)
+ WWW(可以加载任意处资源,包括项目外资源(如远程服务器))
+ AssetDatabase(只能加载Assets目录下的资源,但只能用于Editor)
+ UnityWebRequest(可以加载任意处资源,是WWW的升级版本)
>==**资源加载适用于需要加载资源较多的 情况就不用一个一个的拖拽进去**==
---
👨‍💻👍Resource资源加载操作

---
> **加载资源前首先需要在project面板中创建Resource名字的文件夹,为固定文件夹用于资源加载**

**==以加载AudioClip类型的资源为例:==**
+ 根目录加载 Resource.Load< AudioClip>("voice");  
+ 子目录加载 Resource.Load<AudioClip> ( @ " 子目录名/ voice")  ;
+ 另一种形式: 
**Object xx  =  Resource.Load("voice");
AudioClip yy  as xx ;  // 显性类型转换 ,前提是二者兼容**
+ 加载同类型所有资源的方法:
①根目录加载: AudioClip []  xx = Resource.AllLoad<AudioClip>(" ") ;
②子目录加载:AudioClip [] yy = Resource.AllLoad<AusioClip>(" 子目录名");
---

**关键字:@ ,as**

 + 卸载AB包的方法: Resource. UnLoadAsset

```csharp
void Start()
    {

        Object obj= Resources.Load("sound");
        //AudioClip ac = obj as AudioClip;
        AudioClip ac = (AudioClip)obj;
        AudioSource.PlayClipAtPoint(ac, transform.position);

        //Resources.LoadAll<AudioClip>("Prefabs");
        AudioClip[] audioClips= Resources.LoadAll<AudioClip>("");
        foreach (var item in audioClips)
        {
            Debug.Log(item);
        }

        //Resources.UnloadAsset
    }
  • C#中的回收机制是系统自动回收的,有多种回收机制,不像其他语言需要手动回收

API——场景(Scene)加载


👨‍💻👍加载场景的方法


  • SceneManager.LoadScene() ; 场景同步加载
  • SceneManager.LoadSceneSAsyn(); 场景异步加载
  • Application.LoadLevel():同步加载
  • Application.LoadLevelAsync():异步加载
  • Application.LoadLevelAddictive():同步附加式加载
  • Application.LoadLevelAddictiveAsync():异步附加式加载

👨‍💻👍SceneManasger的操作


首先添加场景加载的命名空间==Using UnityEngine.SceneManagement ;==
而后把游戏场景都保存(拖拽)在 Buid setting 里面,相当于存储场景的目录

在这里插入图片描述


👍1.同步加载


SceneManager.Load( 序列号) ;
SceneManager.Load( "场景名") ;

 void Start()
    {
   
   
        //SceneManager.LoadScene(1);
        //SceneManager.LoadScene("TriggerTest");
    }

缺点:加载时造成画面卡帧,原因为,在未加载完成前画面是停止的,所以是卡帧现象


👍2.异步加载


异步加载与协程配套使用,协程也属于异步加载中的一部分
【 优点:不影响主进程的加载】

SceneManager.LoadAsync(序列号)
SceneManager.LoadAsync(“场景名”)

==但是通常我们和协程一起使用:==

StartCoroutine(协程迭代器方法() ); //调用协程

==AsyncOperation== 解析:、

  • AsyncOperation 该类型翻译为异步操作 ,为下面获得异步场景的返回值
    AsyncOperation ao= SceneManager.LoadSceneAsync(2);

  • ao.allowSceneActivation = true 激活场景

  • ao.progress 场景加载的进度

    
     void Update()
     {
         
         
         if (Input.GetKeyDown(KeyCode.Space)) //按下空格调用协程
         {
         
         
             StartCoroutine(LoadNextAsyncScene());
         }
    
         if (Input.anyKeyDown&&ao.progress>=0.9f) //当场景进程加载超过百分之90 激活场景
         {
         
         
             ao.allowSceneActivation = true;
         }
     }
    
     IEnumerator LoadNextAsyncScene()
     {
         
         
         AsyncOperation  ao= SceneManager.LoadSceneAsync(2);
         ao.allowSceneActivation = false;
         while (ao.progress<0.9f)
         {
         
         
             //当前场景加载进度小于0.9
             //当前场景挂起,一直加载,直到加载基本完成
             yield return null;
         }
         Debug.Log("按下任意键继续游戏");
     }
    

API——光源组件



👺组件API --window -light


☑️三光——点光源,聚光灯,面光源(烘培模式开启)--烘培-节约性能
在这里插入图片描述
☑️光源模式——实时,烘培,混合
在这里插入图片描述
☑️颜色——光源颜色
在这里插入图片描述

☑️阴影——生硬,柔和——效率区别
-在这里插入图片描述

☑️投影遮罩——只适用聚光灯,需添加Textuer
在这里插入图片描述
☑️光晕开关 + 耀斑(聚光)—— 前者是球形光(太阳蜡烛) 后者是人眼看到强光的效果 (耀斑有其对应的材质)
在这里插入图片描述


👺光设置面板界面 --window -light


针对设置光源参数的默认值

☑️天空盒材质的更换
☑️太阳光源的设置
☑️Fog雾开关——雾面效果,性能消耗
☑️耀斑的调节
☑️遮罩材质的更改

在这里插入图片描述


API——Camera组件


可编辑参数了解

  • 🙈Clear Flags

在这里插入图片描述

  • 🙈CullingMask选择层级进行渲染
  • 🙈Projection
    在这里插入图片描述

  • 🙈Target Texture 小地图应用

    • 🙈Occlusion Culing 的勾选 优化性能 减少渲染
    • 🙈渲染分辨率的设置了解 --性能相关
    • 🙈分屏操作 viewport Rect --应用于双人成行类的游戏

API

  • 🙈静态成员
    在这里插入图片描述

  • 🙈委托

在这里插入图片描述在这里插入图片描述

  • 🙈成员变量
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述


API——Screen组件


在这里插入图片描述

  • 🅰️当前屏幕分辨率宽高的获取
    ——Resolution r = Sreen.currentResolution
  • 🅰️当前屏幕宽高的设置
    ——Sreen.width &Screen.heiht
  • 🅰️当前屏幕的休眠模式
    ——scree.SleepTimeOut .NewSleep
    • 🅰️窗口转换的四个模式
      在这里插入图片描述
    • 🅰️移动屏幕转向
      在这里插入图片描述

API——Application类


  • 在UnityEngine命名空间下
  • 作用:对程序运行的数据进行操作控制
    在这里插入图片描述
  • ❤️ Application.LoadLevel() ——老式场景资源加载的方法
  • ❤️ Application.Quit()——退出游戏(前提是游戏已经打包后运行)

API——cursor类


  • 在UnityEngine命名空间下
  • 鼠标的隐藏 ——Cursor.Visible();
  • 鼠标的锁定,限制范围 CursorState = CursorLockMode.下面三个
    在这里插入图片描述
  • 设置鼠标图片——Cursor.setCursor(三个参数如下)
    在这里插入图片描述在这里插入图片描述

bug情况以及处置


👨‍💻👍1.中文显示乱码现象的解决措施


  • unity-Hub--版本显示资源---Date------resouces------ScriptTempelet--------81(文件名)->可自定义初始化界面
  • 在这里插入图片描述

👨‍💻👍2.版本中存在老包升级情况


  • windows -- packge Manager\

👨‍💻👍3.printf 和 Debug.Log的区别


(1)printf : 必须要继承,Monobehivar类

(2)Debug.Log:

1.Debug.LogWarning :显示警告、

2.Debug.LogError:显示错误


⭐相关文章⭐
———————————————————

-本站最全-unity常用API大全(万字详解),不信你不收藏

-关于游戏剧情模式中用到的基础简单API

-控制游戏人物移动的细节到底有多少?

-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)

-基于unity物体定点移动与模拟刹车的细节 GIF 图文详解
————————————————————
⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!

目录
相关文章
|
4月前
|
API C# 图形学
【Unity 3D】常见API的讲解以及在C#脚本中的执行(附源码)
【Unity 3D】常见API的讲解以及在C#脚本中的执行(附源码)
60 1
|
10月前
|
API 图形学
【2023unity游戏制作-mango的冒险】-前六章API,细节,BUG总结小结
【2023unity游戏制作-mango的冒险】-前六章API,细节,BUG总结小结
95 0
|
10月前
|
存储 API 图形学
【2023unity游戏制作-mango的冒险】-2.开始画面API制作
【2023unity游戏制作-mango的冒险】-2.开始画面API制作
103 0
|
10月前
|
编译器 API 图形学
unity常用API基础知识
常用API基础知识
149 0
|
JSON API 图形学
Unity 接入高德开放API - 天气查询
Unity 接入高德开放API - 天气查询
409 1
Unity 接入高德开放API - 天气查询
|
API 图形学
Unity中GameObject API解析
如何在脚本中获取自身所在的GameObject? 我们知道脚本必须挂在一个GameObject上面才能执行,那么如何知道当前脚本所挂载的GameObject是哪一个呢? 这就需要用到gameObject属性了。
8719 0
|
API C#
Unity常用旋转API
Unity中的旋转通常可以用Transform 直接控制和 rotation 控制两种方式。 一、Transform控制(工程中的scene1) 1.1 Transform.Rotate 旋转某个角度 函数定义 [csharp] view plain copy public void Rotate...
11648 0
|
API C# 图形学
Unity SceneManager场景管理Chinar详解API
本文提供全流程,中文翻译。 Unity SceneManager场景管理Chinar详解API 助力快速理解 Unity 场景管理的 API 诸多用法 Unity 场景API中文详解 我们在游戏开发中,经常用到关卡切换、场景切换、加载场景等诸多功能性操作 Unity 为我们提供了场景管理类.
6633 0
|
4月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
48 0