什么是API?——预先设置好的编程接口


事件函数及常用脚本

事件函数的执行顺序

具体可参考:docs.unity.cn/cn/current/Manual/ExecutionOrder.html

*函数前加fix和不加fix的区别(如Fixupdate和update的区别):加fix后调用执行的次数固定,不会再受到电脑硬件影响。正常来说,电脑的一帧受硬件本身的影响,在0.02s左右上下浮动,update调用的次数就是0.02s左右一次,而fixupdate受客观时间影响,固定0.0166...667s执行一次

常用的事件函数

Time类

CaptureFrameRate        设置帧速率并截图

deltaTime        当前帧所占用时间

//在update方法中1s向前移动1m
//正常而言,update时间是0.02s(1/50 s)上下,直接写移动方法后物体相当于0.02s左右移动1mcube.Translate(Vector3.forward/50f);
cube.Translate(Vector3.forward * Time.deltaTime);    //更为精确的写法

fixedDeltaTime        固定的一帧所占用的时间

realtimeSinceStartup        从游戏开始运行到现在所用时间(不受暂停等操作影响)

//测试哪个方法更占用性能public int runCount = 10000; //一条代码运行多次放大时间测试性能void Method1()
{int i = 1+2;
}float time1 = Time.realtimeSinceStartup;
for(int i=0;i<runCount;i++)
{Method1();
}
float time2 = Time.realtimeSinceStartup;
Debug(time2-time1);    //该方法执行10000次所用时间//-----------------------------------------------------------void Method2()
{int j = 1*2;
}float time3 = Time.realtimeSinceStartup;
for(int i=0;i<runCount;i++)
{Method2();
}
float time4 = Time.realtimeSinceStartup;
Debug(time4-time3);   //通过比较这两个差值,得出哪个方法更加占用性能

time        游戏实际运行时间

fixedTime        游戏实际运行时间,值和time接近

timeSinceLevelLoad        Scene在加载后游戏运行的时间,如果进入下一个scene将重新计时

frameCount        帧数

timeScale        让游戏暂停/加速/减速

//游戏暂停Time.timeScale = 0;  //影响Time.deltaTime的系数 可以理解为 Time.deltaTime *=Time.timeScale
//注意:物体需要*Time.deltaTime才会暂停//0.5倍速
Time.timeScale = 0.5;

创建游戏物体

方法一:

GameObject go = new GameObject(); //括号内可加字符串如“Cube”,则创建一个方块

方法二:

//根据prefab或场景中的游戏物体创建public GameObject prefab;
GameObject.Instantiate(prefab);

方法三:

GameObject.CreatePrimitive(PrimitiveType.Plane);
//该方法可创建U3D中基本形状

为游戏物体添加组件

GameObject go = GameObject.CreatePrimitive(PrimitiveType.Plane);
go.AddComponent<Rigidbody>();
go.AddComponent<API01EventFunction>();    //可以添加自定义脚本

判断游戏物体是否被禁用

xxx.activeInHierachy    //判断场景中的物体是否被禁用,返回bool值
//物体会受到父物体是否被禁用的影响,如果父物体被禁用,则该物体也不显示,此时返回falsexxx.activeSelf    //判断自身是否激活,即使父物体被禁用,如果物体本身未被禁用则返回true

Unity常用类

游戏——>场景——>游戏物体——>组件

一个游戏由多个场景组成

一个场景由多个游戏物体组成

一个游戏物体由多个组件组成

UnityEngine.Object(基类)——>GameObject

——>Component

UnityEngine.Object

属性

name        返回名称

方法

Destroy();

DontDestroyOnLoad();        将物体从A场景带入B场景时不销毁游戏物体

FindObjectOfType<>();        在游戏场景中找到第一个含有该组件物体下的第一个该组件

Light light = FindObjectOfType<Light>();
light.enabled = false;

FindObjectsOfType<>();        找到游戏场景中的所有该组件并返回一个数组

Transform[] ts = FindObjectsOfType<Transform>();
//不查找未激活的游戏物体

Instantiate        更多参数可查找API

(Object original,Vector3 position,Quaternion rotation,Transform parent);

创建的物体,位置,旋转,哪个父物体下

(Object original,Transform parent);

不指定位置旋转,放于parent下;

(Object original,Transform parent,bool InstantiateInWorldSpace)

最后一个参数为是否世界坐标系,如果为True则是,False则会根据父物体的坐标位置和旋转改变自身的位置和旋转。

GameObject类与Component类中的公共方法

AddComponent();

CompareTag();

SetActive();

BroadcastMessage();

public GameObject target;
target.BroadcastMessage("Attack");//其下所有子物体及其下所有脚本如有如下方法:void Attack()
{}//则被调用

SendMessage();

SendMessageUpwards();        向其自身及其所有祖先发送消息

GetComponent

GetComponents

GetComponentInChildren

GetComponentsInChildren

GetComponentInParent

GetComponentsInParent

GameObject类

属性

activeHierachy

activeSelf

xxx.activeInHierachy    //判断场景中的物体是否被禁用,返回bool值
//物体会受到父物体是否被禁用的影响,如果父物体被禁用,则该物体也不显示,此时返回falsexxx.activeSelf    //判断自身是否激活,即使父物体被禁用,如果物体本身未被禁用则返回true

layer

scene

tag

方法

CreatePrimitive();

Find();        根据名字查找物体

GameObject go = GameObject.Find("Main Camera");
go.SetActive(false);

FindGameObjectWithTag        根据标签,查找到第一个游戏物体

FindGameObjectsWithTag        根据标签,查找所有游戏物体

GameObject[] gos = GameObject.FindGameObjectsWithTag("Main Camera");
gos[0].SetActive(false);

Component类——>MonoBehaviour类

属性

isActiveAndEnabled        判断组件是否激活

enabled        激活/禁用

tag

gameObject        当前游戏物体

transform

name

方法

print();        静态方法,输出日志

Invoke("xxx",int x);        调用某方法,在x秒后(x这个参数可以不写)

CancelInvoke("xxx")        取消Invoke,如不指定参数则取消所有Invoke

InvokeRepeating        重复调用

InvokeRepeating("Attack",4,2);
//4s后重复调用Attack方法,每2s调用一次
//不用放于Update()中!!!

IsInvoking        判断某方法是否正在调用

如果执行的是一个普通方法,那么会等这个普通方法执行完,然后再继续执行。如果调用的是一个协程方法,那么调用完协程方法后,不会等这个方法执行完就继续向下执行了。

1.协程方法不会阻塞当前方法的运行

2.协程方法自身可以进行暂停

StartCoroutine

public GameObject cube;//1.返回值是IEnumeratorIEnumerator ChangeColor()
{Cube.GetComponent<MeshRenderer>().material.color = color.blue;yield return null;
}//2.返回参数的时候用yield return//协程暂停yield return new WaitForSeconds(3);    //等待3s//3.调用协程方法:StartCoroutine(method());void Start()
{StartCoroutine(ChangeColor());
}
//通过协程实现颜色的渐变
void Update()
{if (Input.GetKeyDown(KeyCode.Space))StartCoroutine(Fade());
}IEnumerator Fade()
{for(float i=0;i<=1;i+=0.1f)    //颜色变化的范围从0到1{cube.GetComponent<MeshRenderer>().material.color = new Color(i,i,i);//Color的三个参数代表RGByield return new WaitForSeconds(0.1f);    //动画暂停0.1s}
}

StopAllCoroutines

StopCoroutine("xxx");        停止一个指定的协程

注意:StartCoroutine 与 StopCoroutine 调用的参数需相同

如字符串则同为字符串,如为IEnumerator则同为IEnumerator

IEnumerator ie;
ie=Fade();
StartCoroutine(ie);
StopCoroutine(ie);//orStartCoroutine("Fade");
StopCoroutine("Fade");

Mouse相关方法

可搜索API OnMouseXXX

注意:如果物体标记为Trigger,则保证physics窗口中QueriesHitTriggers勾选

Mathf类

静态变量

PI

Deg2Rad        度数变为弧度

Rad2Deg        弧度变为度数

Epsilon        最小单位小数

任意值+Epsilon=任意值本身

任意值-Epsilon=值本身

0+Epsilon=0

0-Epsilon=0

Infinity        无穷大

NegativeInfinity        无穷小

静态方法

Abs        绝对值

Ceil        向上取整,返回float

CeilToInt        向上取整,返回Int

Clamp(float value,float min,float max);        将值限定在一个范围内

value<min        返回min

value>max        返回max

min<value<max        返回value

public Transform cube;
cube.position = new Vector3(Mathf.Clamp(Time.time,1.0f,3.0f),0,0)//物体小于1s时静止,1-3s时运动,大于3s时静止//简化代码:
private int hp=100;
void TakeDamage()
{int hp-=9;//if(hp<0)hp=0;hp=Mathf.Clamp(hp,0,100);
}

Clamp01(float value)        将min设置为0,max设置为1

ClosetPowerOfTwo(int value)        取得和value最近的2的次方数

DeltaAngle(float current,float target)        计算两角度间的最小距离

Exp(float power)        e^power次方

Floor(float f)        向下取整,返回float

FloorToInt(float f)        向下取整,返回int

Max        返回一个最大值

Min        返回一个最小值

Pow(float f,float p);        f^p次方

Sqrt(float f)        根号f

Lerp(float a,float b,float t)

0<=t<=1,通过系数t取a与b之间的值,t=0时返回a,t=1时返回b

//减速运动 无限接近目标
float x = cube.position.x;
float newx = Mathf.Lerp(x,10,0.1f);
cube.position = new Vector3(newx,0,0);

MoveTowards(float current,float target,float maxDelta);        与Lerp相似,但是为匀速,即每次current+maxDelta,但小于target

1s运行1m
float x = cube.position.x;
float newx = Mathf.MoveTowards(x,10,Time.deltaTime);
//Time.deltaTime*speed 可以控制运行的速度
cube.position = new Vector3(newx,0,0);

PingPong(float t,float length);        在0~length之间来回变化,t为系数控制来回

0<=t<=length时        返回t

length<t<=2*length        返回2*length-t

...

形成往复

//来回运动
cube.position = new Vector3(Mathf.PingPong(Time.time,10),0,0)
//每秒运行1m

Random类

属性

Value        0.0~1.0之间的随机值

state        随机数种子

rotation        四元数随机值

insideUnitCircle        在一个物体附近单位圆范围内随机生成一个三维position

insideUnitSphere        在一个物体附近单位球体范围内随机生成一个三维position

方法

Range()        Random.Range(4,10)随机生成4~9之间的数

InitState(int seed)        初始化随机数种子

Quaternion类        四元数

输出旋转角

print(cube.eulerAngles);    //欧拉角
print(cube.rotation);    //四元数

赋值

cube.eulerAngles = new Vector3(10,0,0);//四元数赋值不可写为:
//cube.rotation = new Vector3(10,0,0);
//欧拉角不可赋值给四元数
//应使用欧拉角与四元数的转换方法Eulercube.rotation = Quaternion.Euler(new Vector3(10,0,0));

获取四元数的欧拉角

cube.rotation.eulerAngles;

创建一个由A望向B的四元数方向

//使用 LookRotation(Vector3 forward,Vector3 upwards);public Transform player;
public Transform enemy;
Vector3 dir = enemy.position - player.position;
player.rotation = Quaternion.LookRotation(dir);
//返回前方向到dir的旋转

Lerp & Slerp(一般多用Slerp)

由当前旋转转到目标旋转

Quaternion target = Quaternion.LookRotation(dir);
player.rotation = Quaternion.Slerp(player.rotation,target,Time.deltaTime);//Slerp比Lerp更准确,更平滑

Input类

属性

anyKey        任意键

anyKeyDown        任意键按下后

mousePosition        返回鼠标在屏幕上的位置

方法

GetKeyXXX        监听键盘事件        具体方法见API文档

GetKey 有哪些键盘事件可在API中搜索:Conventional Game Input

GetMouseXXX        监听鼠标事件        具体方法见API文档

GetButtonDown("XXX")        其中,XXX为虚拟按钮,可在InputManager(Edit->Project Settings-> Input)窗口查看有哪些虚拟按键并设置

GetAxis("XXX")        返回一个虚拟按键输入后的渐变值

//控制移动
cube.Translate(Vector3.right * Time.deltaTime*Input.GetAxis("Horizental"));//其中,Horizental为虚拟按键,当按下a或d时,返回一个-1到0或0到1的变化值

GetAxisRaw("XXX")        返回一个虚拟按键输入后的确定值(如a就为-1,d就为1)

Vector2 结构体(Vector3 类似不重复)

属性

x

y

//取得二维向量的x与y//1.
a.x    a.y
//2
a[0]    a[1]

magnitude        长度

normalized        单位化

sqrMagnitude        未开根的长度

关于Vector2值的修改:

transform.position = new Vector3(3,3,3);
//transform.position.x = 3    错误写法
//应为:Vector3 pos = transform.position;
pos.x = 10;
transform.position = pos;//向量为结构体,是值类型,应当整体赋值

方法

Normalize();        单位化

更多见API

Rigidbody类

属性

centerOfMass        取得中心点

position        位置,性能比Transform.position好

rotation        旋转,性能比Transform.rotation好

更多见API

方法

MovePosition        移动会更加平滑

playerRgd.MovePosition(playerRgd.transform.position + Vector3.forward*Time.deltaTime );

AddForce(Vector3)        施加力

Camera类

main        获取mainCamera

private Camera mainCamera;mainCamera = Camera.main;

鼠标发射射线,检测鼠标是否停留在物体上

Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition)
//该方法生成一个由屏幕中心点到某物体中心的一条射线RaycastHit hit;bool isCollider = Physics.Raycast(ray,out hit);
if(isCollider)
Debug.Log(hit.collider);

Application类

属性

datapath       路径,Assets文件夹

persistentDataPath

streamingAssetsPath        资源文件,U3D内命名为StreamingAssets的文件夹不会被编译,会原样输出至打包目录

temporaryCachePath        临时目录

方法

Application.OpenURL()        打开网络

Application.Quit()        退出

Application.CaptureScreenShot()        路径名

SceneManager类

属性

sceneCount        场景总数量

方法

LoadScene()        加载场景

Using UnityEngine.SceneManagement;SceneManager.LoadScene(1);    //1为场景编号,在编译界面调整顺序//orSceneManager.LoadScene("02-MenuScene");//Scene的名称

GetActiveScene()        得到当前场景

LoadSceneAsync()        异步加载

GetSceneAt()        获取已加载的场景信息

射线检测

Physics.Raycast

Physics.RaycastAll        射线会穿透检测所有的物体

检测正前方是否有敌人

void update()
{Ray ray = new Ray(transform.position+transform.forward,transform.forward);//其中transform.position + transform.forward是将射线发射点前置一些,防止射线与自身碰撞bool isCollider = Physics.Raycast(ray);Debug.Log(isCollider);
}//其中Physics.Raycast()有众多重载方法,更多可见APIPhysics.Raycast(ray,out hit);    //可通过hit获取碰撞物体
//hit拥有的属性:    hit.point位置    hit.collider物体的碰撞器Physics.Raycast(ray,Length,LayerMask);//LayerMask:射线只检测Layermask的层
LayerMask.GetMask("Enemy");//获取Enemy层

UGUI方法

实现事件监听的三个方法:

1.直接拖拽脚本

2.代码添加

Using UnityEngine.UI;//buttonpublic GameObject btnGameComponent;
btnGameComponent.GetComponent<Button>().onClick.AddListener(this.ButtonOnClick);void ButtonOnClick()
{Debug.Log("ButtonOnClick")
}//slider(dropdown,toggole都类似)public GameObject sliderGameObject;
sliderGameObject.GetComponent<Slider>().onValueChanged.AddListener(this.OnSliderChanged);void OnSliderChanged(float value)//dropdown为int32,toggle为bool
{Debug.Log("SliderChanged:"+value);
}

3.接口实现

using UnityEngine EventSystems;
using UnityEngine.UI;public class UIEventManager:MonoBehaviour,IPointerDownHandler
{public void OnPointDown(PointerEventData eventData)//eventData为封装数据,命名要求相同,不用在意里面写了什么{Debug.Log("xxx");}
}//启动并按下按钮后启动日志//其他更多接口:
IPointerClickHandler    //点击后出发
IPointerUpHandler    //抬起
IPointerEnterHandler    //进入
IPointerExitHandler    //移出
//还有拖拽相关的接口IDragXXX查API

WWW类

载入网络图片,见API

Touches类        触摸检测

见API,建议使用easyTouch插件做触摸检测

Camera类

属性

main        得到main camera

方法

ScreenPointToRay()        将一个屏幕坐标转换为射线

//发射并显示鼠标位置的一条射线
private Camera camera;void Start()
{camera = Camera.main;
}void update()
{Ray ray = Camera.ScreenPoinToRay(Input.mousePosition);Debug.DrawRay(ray.origin,ray.direction);
}//检测鼠标位置是否有物体
private Camera camera;void Start()
{camera = Camera.main;
}void update()
{Ray ray = Camera.ScreenPoinToRay(Input.mousePosition);RaycastHit hit;bool isCollider = Physics.Raycast(ray,out hit);Debug.Log(hit.collider)//不用hit.collider.gameObject是预防出现空指针
}

Character Controller类

属性

bool isGrounded        判断是否在地面上

方法

OnControllerColliderHit        返回碰撞到的collider,会自动多次调用

SimpleMove        控制移动

控制移动

public float speed=3;
private CharacterController cc;cc=GetComponent<CharacterController>();
float h=Input.GetAxis("Horizental");
float v=Input.GetAxis("Vertical");
cc.SimpleMove(new Vector3(h,0,v)*speed);//orcc.Move(new Vector3(h,0,v)*speed*Time.deltaTime);

Mesh类

//将一个方体的Mesh变为球体public Mesh mesh //u3d中赋值为球体GetComponent<MeshFilter>.mesh = mesh;

Material类

//颜色渐变private Material mat;
mat = GetComponent<MeshRenderer>().material;
mat.color = Color.Lerp(mat.color,Color.red,Time.deltaTime);

Animator类

speed        设置状态机速度

GetCurrentAnimatorClipInfo        获取当前状态

AudioSource类

//播放声音GetComponent<AudioSource>().play();

粒子系统

ParticleSystem.MainModule.main = smokePuff.GetComponent<ParticleSystem>().main;

Unity API常用方法和类相关推荐

  1. Unity API常用方法和类学习笔记2

    Unity API常用方法和类学习笔记2 ------Mathf & Input & Vector & Random 类Mathf 一.静态变量 print(Mathf.Deg ...

  2. Unity API常用方法和类学习笔记1

    Unity API常用方法和类学习笔记1 ------主要构架(Unity-Engine.GameObject.Component) 事件 一.事件执行顺序 二.测试代码 using System.C ...

  3. 《Unity API常用方法和类详细讲解—Siki学院》课程学习笔记02

    <Unity API常用方法和类详细讲解-Siki学院>课程学习笔记02 课时10 GameObject.Component和Object的千丝万缕的关系 一个游戏由多个场景组成,一个场景 ...

  4. 《Unity API常用方法和类详细讲解—Siki学院》课程学习笔记03

    <Unity API常用方法和类详细讲解-Siki学院>课程学习笔记03 课时18-20协程及其执行 1.使用Coroutine实现颜色动画渐变 void Update(){if (Inp ...

  5. Unity API常用方法和类的解析

    一.事件函数执行的先后顺序 FixedUpdate每秒执行固定次数,应该将处理跟物理相关的运动的代码放在FixedUpdate中. Update和LateUpdate跟硬件和代码性能有关,每秒执行次数 ...

  6. 我的Unity学习笔记----------API常用方法和类详解(四)

    二十三. Camera组件(类) 通过获取camera组件把场景中鼠标的位置(点)转化为射线 mainCamera=GameObject.Find("MainCamera").Ge ...

  7. 学习笔记之-java8的新特性-函数式接口,lambda表达式,方法引用,Stream API,Optional类

    1.Lambda表达式 用匿名内部类的方法去创建多线程1.new Thread2.参数传递new Runnable3.重写run方法4.在run方法中去设置线程任务5.调用start问题:我们最终目标 ...

  8. java api 第一个类是_JAVA之Object常用API

    [Object类.常用API] 主要内容Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 第一章 Object类 1.1 概 ...

  9. Unity游戏存档-PlayerPrefs类

    对于游戏存档除了XML,Json,Sqlite,unity提供了一个类可以用来存储数据,那就是PlayerPrefs. 这个类对应的API如下 Class Functions类函数 SetInt Se ...

最新文章

  1. Silverlight 预定义颜色速查表
  2. hystrix 源码 线程池隔离_基于hystrix的线程池隔离
  3. 【LeetCode】0046.全排列 (递归详解)
  4. Php基础正则表达式篇
  5. python高级应用_Python高级编程技巧
  6. java.util.Date和java.sql.Date之间的相互转换
  7. 数据结构与算法JavaScript (一) 栈
  8. (原創) 如何对array或struct做初始化? (memset()) (C/C++) (C)
  9. @value注解_Java系列之注解
  10. SQL Server 提高创建索引速度的 2 个方法
  11. 关于图片预加载的思考
  12. ora-24247:网络访问被访问控制列表(ACL)拒绝
  13. C# 7.0 新特性3: 模式匹配
  14. 2021年,Web前端还好找工作吗?
  15. Kubernetes: 集群网络配置 - flannel
  16. android风格ppt模板下载,PPT模板大全app下载
  17. 数据告诉你,谁是2019年最硬核公链?
  18. Ubuntu16.04《解压7z.001文件》
  19. adf的主要功能之一是_ADF软件介绍
  20. 图标照旧的效果_这不是而且不能成为“一切照旧”

热门文章

  1. 修改VirtualBox上的macOS屏幕分辨率1920*1080,virtualbox5.2版本方法
  2. 微信域名检测php,微信域名检测接口(官方api)——PHP请求示例
  3. [原创]续一:WMI进程占用CPU过高,由Alibaba的pcUnitTest.exe文件引起
  4. 模块化笔记软件综合评测:Craft、Notion、FlowUs
  5. 【Android高级】查看手机及应用内存状况的方法
  6. 【转】Java面试题合集
  7. 成都农商银行软件测试面试题,农商行历年笔试真题找不到?不慌!16家农商行笔试题库等你来刷!...
  8. 正则表达式 企业统一社会信用代码、企业13位工商注册号、企业组织机构代码...
  9. 从隔壁老王开始的信号处理入门
  10. 23位华人学者入选!2022年ACM杰出会员名单公布!