Unity脚本常用类和类的函数
Posted 任小蜩oops
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity脚本常用类和类的函数相关的知识,希望对你有一定的参考价值。
常用函数的作用和调用时机
//唯一调用,最早调用的
private void Awake()
Debug.Log("Awake");
//激活组件,划上勾时调用,可能调用多次
//所以不要进行初始化操作
private void OnEnable()
Debug.Log("划勾!!!");
//唯一调用,第一次激活OnEnable之后
void Start()
Debug.Log("Start");
//每一帧调用一次,不要轻易输出awa
//每秒跑多少帧和电脑性能有关
void Update()
//Update每执行完,就会跟着执行一次,跟屁虫
private void LateUpdate()
//每隔特定时间执行一次,与电脑性能无关
//默认是0.02秒一次
private void FixedUpdate()
//与OnEnable相反
//非激活,取消勾时调用一次
private void OnDisable()
Debug.Log("你敢取消我,等着吧!");
//销毁、移除组件时调用一次
private void OnDestroy()
Debug.Log("你敢移除我,你完蛋啦!");
Vector3类
主要常用功能
1、Vector3可以表示向量、坐标、旋转和缩放。
2、有函数可以计算两向量夹角,计算两点之间距离、计算点乘、叉乘、插值、向量的模,还能获得某一个向量的规范化向量,即单位向量。
void Start()
//向量,坐标,旋转,缩放
Vector3 v = new Vector3(1, 1, (float)0.5);
v = Vector3.zero;
v = Vector3.one;
v = Vector3.forward;
v = Vector3.up;
v = Vector3.left;
v = Vector3.down;
v.x = 1;
v.y = 2;
v.z = 3.5f;
v = Vector3.zero;
v = Vector3.right; //1,0,0
Vector3 v2 = Vector3.forward; //0,0,1
//计算两个向量夹角
Debug.Log(Vector3.Angle(v, v2));
//计算两点之间距离
Debug.Log(Vector3.Distance(v, v2));
//计算点乘
Debug.Log(Vector3.Dot(v, v2));
//计算叉乘,结果与两向量的顺序有关
Debug.Log(Vector3.Cross(v, v2));
//插值(在两向量间进行一定比例的计算),做动画时会用
Debug.Log(Vector3.Lerp(Vector3.zero, Vector3.one,0.5f));
//向量的模
Debug.Log(v.magnitude);
//规范化向量(将向量变为单位向量)
Debug.Log(v.normalized);
Rotate类和Quaternion类(四元数)
主要常用功能
1、欧拉角和四元数的相互转换
2、看向一个物体
void Start()
//旋转,欧拉角,四元数(效率高)
Vector3 rotate = new Vector3(0, 30, 0);
Quaternion quaternion = Quaternion.identity;//无旋转,相当于0,0,0
//通过欧拉角创建四元数
quaternion = Quaternion.Euler(rotate);
//四元数转换成欧拉角
rotate = quaternion.eulerAngles;
//看向一个物体
quaternion = Quaternion.LookRotation(new Vector3(0, 0, 0));
DeBug类
主要常用功能
1、在控制台输出语句,可以选择正常输出,也可以选择在Warning和Error中输出。
2、绘制线条,可以绘制线段和射线。
void Start()
Debug.Log("Test01");
Debug.LogWarning("Test02");
Debug.LogError("Test03");
void Update()
//绘制一条线(起点,终点),相当于两点连线
Debug.DrawLine(Vector3.zero, Vector3.one,Color.blue);
//绘制一条射线(起点,射线而这个射线指向某一点),相当于从一点向一个方向做射线
//Debug.DrawRay(Vector3.zero, Vector3.one);
GameObject类
主要常用功能
1、获得当前脚本所挂在的游戏物体,通过所得游戏物体的对象,还可获取物体名称、物体标签、物体所在图层等信息。
2、通过游戏物体的对象,获取子物体或父物体的组件,也可以自行添加一个任意组件
3、通过物体名称、tag标签和图层都可获取某个特定游戏物体的GameObject
4、获取预设体,控制预设体的激活与否
5、通过预设体来实例化一个新物体,利用Instantiate( )实例化函数
6、用Destroy( )销毁某个特定游戏物体,括号里填GameObject类的对象
public GameObject Cube;
//获取预设体
public GameObject Prefab;
void Start()
//拿到当前脚本所挂载的游戏物体
/*GameObject go = this.gameObject;
Debug.Log(go.name);*/
//名称
Debug.Log(gameObject.name);
//tag标签
Debug.Log(gameObject.tag);
//layer图层
Debug.Log(gameObject.layer);
//立方体的名称
Debug.Log(Cube.name);
//当前真正实际的激活状态
Debug.Log(Cube.activeInHierarchy);
//当前自身激活状态
Debug.Log(Cube.activeSelf);
//获取transform组件
//Transform trans = this.transform;
Debug.Log(transform.position);
//从自身获取其他组件
BoxCollider bc = GetComponent<BoxCollider>();
//获取当前物体子物体身上的某个组件
//GetComponentInChildren<CapsuleCollider>();
//获取当前物体的父物体身上的某个组件
//GetComponentInParent<BoxCollider>();
//添加一个组件
gameObject.AddComponent<BoxCollider>();
gameObject.AddComponent<Audiosource>();
Cube.AddComponent<AudioSource>();
//通过游戏物体的名称来获得游戏物体
GameObject test = GameObject.Find("Test");
//通过游戏标签来获得游戏物体
test = GameObject.FindWithTag("Enemy");
test.SetActive(false);
Debug.Log(test.name);
//通过预设体来实例化一个游戏物体
//Instantiate(Prefab,transform);//将prefab建为empty的子物体
GameObject go=Instantiate(Prefab, Vector3.zero, Quaternion.identity);//放在0,0,0,且不旋转
//销毁方法
Destroy(go);
Time类
主要常用功能
1、获取当前已运行时间,获取时间缩放值,获取时间间隔
2、因为Time.deltatime为上一帧到这一帧所用时间,而Update()函数又正好是每一帧执行一次,所以可以利用Time.deltatime做一个简易的计时器
float timer = 0;
void Start()
//游戏开始到现在所花的时间
Debug.Log(Time.time);
//时间缩放值(加速减速)
Debug.Log(Time.timeScale);
//固定时间间隔
Debug.Log(Time.fixedDeltaTime);
void Update()
//timer可以当成游戏运行时间,一个计时器
timer += Time.deltaTime;
if (timer > 3)
Debug.Log("大于三秒了");
//上一帧到这一帧所用的游戏时间,很重要
Debug.Log(Time.deltaTime);
private void OnDisable()
Debug.Log("你敢取消我,等着吧!");
Debug.Log("游戏运行时常为" + timer + "秒");
Application类
主要常用功能:
1、获取游戏数据文件夹路径
2、控制游戏是否后台进行
3、打开url网址的功能
4、将游戏关闭
//文件路径啊,游戏后台进行,游戏关闭,打开网址功能,在Application类中
void Start()
//游戏数据文件夹路径(只读,加密压缩,打包时会隐藏)
Debug.Log(Application.dataPath+"/英语好短语.txt");
//持久化文件夹路径(可写,在c盘,跨平台)
Debug.Log(Application.persistentDataPath);
//StreamingAssetus文件夹路径(只读,但不会加密压缩)
Debug.Log(Application.streamingAssetsPath);
//临时文件夹
Debug.Log(Application.temporaryCachePath);
//控制是否在后台运行
Debug.Log(Application.runInBackground);
//打开url
Application.OpenURL("https://space.bilibili.com/44232284");
//退出游戏
Application.Quit();
Scene类和SceneManager类
注意事项:
用场景类一定要引用名称空间
using UnityEngine.SceneManagement;
主要常用功能:
1、可以通过SceneManger.getActiveScene()获取当前场景,然后通过当前场景scene,获取场景名称、场景对应索引等场景信息,最主要是能获取所有游戏物体,储存在一个GameObject类中
2、场景管理类除了获得场景这个功能外,还能跳转场景(很常用!例如跳转地图时),当然还能创建新场景,卸载场景。
ps:这个加载场景是直接加载,如果场景很大,就会加载得很慢,所以通常会采用异步加载场景
void Start()
//两个类,场景类,场景管理类
//跳转场景,可以通过索引,也可以之间用名称
//SceneManager.LoadScene(1);
//SceneManager.LoadScene("My_Scene");
//获取当前场景
Scene scene = SceneManager.GetActiveScene();
//场景名称
Debug.Log(scene.name);
//场景是否已经加载
Debug.Log(scene.isLoaded);
//场景路径
Debug.Log(scene.path);
//场景对应索引
Debug.Log(scene.buildIndex);
//场景所有游戏物体,一个数组
GameObject[] gos = scene.GetRootGameObjects();
Debug.Log(gos.Length);
//场景管理类
//当前记载的活动场景数
Debug.Log(SceneManager.sceneCount);
//创建新场景
SceneManager.CreateScene("newScene");
Debug.Log(SceneManager.sceneCount);
//卸载场景
SceneManager.UnloadSceneAsync("newScene");
//加载场景
SceneManager.LoadScene("My_Scene",LoadSceneMode.Additive);
//异步(多线程,协程)加载场景
//SceneManager.LoadSceneAsync
AsyncOperation类(异步)
注意事项:
用场景类一定要引用名称空间
using UnityEngine.SceneManagement;
1、协程可以理解为多线程,比直接加载场景快很多。默认条件下加载完场景会自动跳转,我们也可以将operation.allowSceneActivation设置为false,这样就不会自动跳转了,例如:结合timer功能做个计时器,到4秒了就跳转。
2、可以输出加载过程中的进度operation.progress,根据这个能做个进度条的功能
AsyncOperation operation;
void Start()
StartCoroutine(loadScene());
//创建协程方法来异步加载场景
IEnumerator loadScene()
operation=SceneManager.LoadSceneAsync(1);
//加载完场景以后不自动跳转
//将operation.allowSceneActivation设置为false,需要跳转时设置为true即可
operation.allowSceneActivation = false;
yield return operation;
float timer=0;
void Update()
timer += Time.deltaTime;
//输出进度(0-0.9),等学建ui时可以做个进度条
Debug.Log(operation.progress);
if (timer > 5)
operation.allowSceneActivation = true;
Transform类
主要常用功能
1、改变位置旋转缩放
2、获得某个具体向量,如transform.up,transform.forward等
3、控制父子关系
//Transform不止能改变位置旋转缩放,还能控制父子关系
void Start()
/*
//获得位置
//绝对位置
Debug.Log(transform.position);
//相对位置,即面板上的数据
Debug.Log(transform.localPosition);
//获得旋转
//欧拉角
Debug.Log(transform.rotation);
Debug.Log(transform.localRotation);
//四元数
Debug.Log(transform.eulerAngles);
Debug.Log(transform.localEulerAngles);
//获得缩放
Debug.Log(transform.localScale);
//获得向量
Debug.Log(transform.forward);
Debug.Log(transform.right);
Debug.Log(transform.up);*/
//父子关系
//获取父物体
//transform.parent.gameObject
//子物体个数
//Debug.Log(transform.childCount);
//解除与子物体的父子关系
//transform.DetachChildren();
//获取子物体
Transform trans = transform.Find("Child");
trans = transform.GetChild(0);
//判断一个物体是不是另外一个物体的子物体
bool res = trans.IsChildOf(trans);
Debug.Log(res);
//设置为父物体
trans.SetParent(transform);
void Update()
//时时刻刻看向0,0,0
//transform.LookAt(Vector3.zero);
//旋转,例如:绕y轴旋转,每一帧转1度
//transform.Rotate(Vector3.up, 1);
//绕某个物体旋转
//transform.RotateAround(Vector3.zero, Vector3.up, 5);
//移动
//transform.Translate(Vector3.forward*0.1f);
Input类中对鼠标和键盘的控制
主要常用功能:
1、对鼠标MouseButton的主要有三种方法GetMouseButtonDown(),GetMouseButton(),GetMouseButtonUp(),分别负责监控鼠标的按下一瞬间,按下时,还有抬起一瞬间,括号内填0就是对左键的监控,填1是对右键,填2是对中键
2、对键盘Key的也主要有三种方法GetKeyDown(),GetKey(),GetKeyUp(),可以看出和对鼠标的监控差不多。括号里可以填KeyCode.A,也可以填"a",记得带双引号。
void Update()
//鼠标的点击
//按下鼠标0左键,1右键,2滚轮
if (Input.GetMouseButtonDown(0))
Debug.Log("鼠标左键按下了");
//持续按下鼠标
if (Input.GetMouseButton(0))
Debug.Log("持续按下左键");
//抬起鼠标
if (Input.GetMouseButtonUp(0))
Debug.Log("抬起鼠标左键");
//按下键盘按键
if (Input.GetKeyDown(KeyCode.A))
Debug.Log("按下了A");
//持续按下按键
if (Input.GetKey("a"))
Debug.Log("持续按A");
/*if (Input.GetKey("w"))
Debug.Log("持续按W");
if (Input.GetKey("s"))
Debug.Log("持续按S");
if (Input.GetKey("d"))
Debug.Log("持续按D");
*/
//抬起键盘按键
if (Input.GetKeyUp("a"))
Debug.Log("松开A");
Input类中对虚拟轴和虚拟按键的控制
主要常用功能:
1、可以通过Input.GetAxis()获取虚拟轴,括号内填轴的名字,默认的水平轴名字为"Horizontal",垂直轴的名字为"Vertical",其中水平轴由a和d控制,垂直轴由w和s控制
void Update()
//获取水平轴
float horizontal = Input.GetAxis("Horizontal");
//获取垂直轴
float vertical = Input.GetAxis("Vertical");
Debug.Log(horizontal + " " + vertical);
//虚拟按键
if (Input.GetButtonDown("Jump"))
Debug.Log("空格");
Input类中对触摸的控制(手机游戏需要)
主要常用功能:
1、使用Input.touches[ ]可以获取Touch型的触摸对象,单点触摸时即Input.touches[0]。
2、可以用switch case判断和捕获触摸阶段发生的事件,开始、移动、结束等信息都可以用TouchPhase得到。
void Start()
//开启多点触摸
Input.multiTouchEnabled = true;
void Update()
//判断单点触摸
if (Input.touchCount == 1)
//触摸对象
Touch touch = Input.touches[0];
//触摸位置
Debug.Log(touch.position);
//触摸阶段
switch (touch.phase)
case TouchPhase.Began:
Debug.Log("开始触摸");
break;
case TouchPhase.Moved:
break;
case TouchPhase.Stationary:
break;
case TouchPhase.Ended:
break;
case TouchPhase.Canceled:
break;
//判断多点触摸
if (Input.touchCount == 2)
Touch t1 = Input.touches[0];
Touch t2 = Input.touches[1];
AudioSource类(声音播放器组件)
主要常用功能:
1、将bgm或者某种音效放在AudioClip中,需要用时就在unity界面将音乐托到脚本上,即可获取音乐对象。
2、可以通过GetComponent<AudioSource>()获取播放器组件对象plaer,通过该对象控制音乐的音频,是否循环,音量,是否播放等,当然这些在unity中都有图形化界面,但也可以通过脚本控制
3、可以通过player.Pause()和player.UnPause(),player.Stop()和player.Play()来控制音乐,player.PlayOneShot(se)来播放se音效,一般都与监控器配合使用
//声明一个AudioClip
public AudioClip music;
public AudioClip se;
//播放器组件
private AudioSource player;
void Start()
player = GetComponent<AudioSource>();
//设定的播放的音频片段
player.clip = music;
//循环
player.loop = true;
//音量
player.volume = 0.5f;
//播放
player.Play();
void Update()
//按空格切换声音播放和暂停
if (Input.GetKeyDown(KeyCode.Space))
if (player.isPlaying)
//暂停播放
player.Pause();
//停止播放
//player.Stop();
else
//继续播放
player.UnPause();
//开始播放
//player.Play();
//按鼠标左键播放音效
if (Input.GetMouseButtonDown(0))
player.PlayOneShot(se);
VideoPlayer(视频播放器组件)
主要常用功能:
1、实现在游戏里看视频
2、先使用GetComponent<VideoPlayer>()获取视频播放器组件对象player,然后通过player组件的player.Pause()和player.Player()函数控制视频的播放和暂停
private VideoPlayer player;
void Start()
player = GetComponent<VideoPlayer>();
void Update()
if (Input.GetMouseButtonDown(0))
if (player.isPlaying)
player.Pause();
else
player.Play();
通过虚拟轴实现角色的移动
void Update()
//水平轴
float horizontal = Input.GetAxis("Horizontal");
//垂直轴
float vertical = Input.GetAxis("Vertical");
//向量
Vector3 dir = new Vector3(horizontal, 0, vertical);
//朝向量方向移动,需要把帧的单位变成秒,就乘个deltaTime
transform.Translate(dir * 5*Time.deltaTime);
触发器
主要常用功能:
1、有三个主要函数,OnTriggerEnter(),OnTriggerStay(),OnTriggerExit(),分别控制角色进入触发器,呆在触发器,还有离开触发器会发生的内容
2、可以与键盘鼠标监控器,还有时间监控器配合使用。如:站在门附近实现按e开关门,站在感应门前3秒开门
private void OnTriggerEnter(Collider other)
GameObject door=GameObject.Find("Door");
if (door != null)
//door.SetActive(false);
//顺时针旋转90度
Vector3 v3 = new Vector3(0, -90, 0);
door.transform.Rotate(v3);
private void OnTriggerStay(Collider other)
private void OnTriggerExit(Collider other)
Collision类(碰撞)
主要常用功能:
1、与触发器有异曲同工的函数
2、有三个主要函数,OnCollisionEnter(),OnCollisionStay(),OnCollisionExit(),分别控制发生碰撞,持续碰撞中,结束碰撞会发生的事件。
ps:下面这种情况下爆炸会持续发生,想让它只爆炸一次,可以直接在该脚本Destroy(prefab),但是更好的办法是各司其职,在爆炸的Explosion预设体上再加个脚本,如果timer大于1就Destroy。
这是一种在游戏脚本中很重要的思想,就是各司其职,自己的脚本只干和自己本身物体相关的。
//创建一个爆炸的预设体
public GameObject prefab;
//发生碰撞
private void OnCollisionEnter(Collision collision)
//创建一个爆炸物理
Instantiate(prefab, transform.position, Quaternion.identity);
//销毁自身
Destroy(gameObject);
//获得碰撞到的物体,collision是被撞物体的信息类
Debug.Log(collision.gameObject.name);
//持续碰撞中
private void OnCollisionStay(Collision collision)
//结束碰撞
private void OnCollisionExit(Collision collision)
Swift 结构体和类的区别
参考技术A 1.结构体属于值类型,类属于引用类型;2.值类型赋值给let var 或者函数传参的时候完,全是深拷贝;
3.引用类型赋值给let var 或者函数传参的时候完,是将内存地址拷贝一份,属于浅拷贝;
4.结构体属于值类型,标准库中的结构体采用copy on write策略,优化效率;
5.结构体不可以继承,可以继承;
6.都可以实现方法,都可以添加计算属性和存储属性,都支持属性监听,都支持扩展.都可以遵守协议.结构体的方法修改属性的时候需要用@mutating修饰(枚举也需要);
7.结构体初始化的时候必须要给属性赋值,来决定结构体在内存中的布局.Class初始化的时候可以暂时不用赋值;
8.结构体声明属性的时候不需要赋值,class 声明属性的时候必须赋值或者包装成Optional;
9.required关键字只支持Class, Class可以用static和Class 关键字修饰静态方法;Struct 只能用Static 修饰;
初始化required修饰的指定初始化器,子类必须要实现同样的指定初始化器,要么继承要么在子中用required重写父类的指定初始化器;
init?可失败初始化器;
指定初始化器;
可选初始化器;
willset\didset
都属于实例属性:只能通过实力去访问
lazy var 是一种延迟的存储类型.存储属性存储在对象或者结构体的内存中,计算属性不占用结构体或者对象的属性.
整个程序运行期,只有一份比如单例;
存储类型属性:
计算类型属性:
非lazy的var的存储属性,计算属性不能设置属性观察器;但是在初始化的时候设置不会触发(包括在init和定义的时候赋值)
传入存储属性:传入结构体或者对象的地址,然后找到存储属性的值,直接访问或者修改;
传入添加了属性观察器的存储属性:传入结构体或者对象的地址,然后在函数内部开辟一段局部变量作为临时存储,并把这个临时地址传入set方法内重新设置,在此之前会调用willset方法,设置完调用didiset方法;
传入计算属性:传入结构体或者对象的地址,然后先调用计算属性的get方法,然后在函数内部开辟一段局部变量作为临时存储,并把这个临时地址传入set方法内重新设置.
类方法和实例方法 也是通过static修饰来区别.用法和OC以一样
使用subscript可以给任何类型(枚举、结构体、类)增加下标功能;subscript的语法类似于实例方法,计算属性,本质就是方法(函数);
不同点在于结构体中的subscript必须实现set方法才能通过p[0] = 10修改值,但是Class的只需要实现get方法就可以实现p[0] = 10赋值,原因是前者是值拷贝,后者是引用拷贝.
值类型不支持继承,只有类支持继承;
swift不像OC任何类都要继承自某一个类;
重写方法重写下标:calss 修饰的类型方法可以通过override重写,但是static修饰的则不可被重写
重写实例属性:可以把父类的存储属性重写为计算属性,只能重写var属性,重写之后权限大于等于夫类
重写类型属性::calss 修饰的计算属性可以通过override重写,但是static修饰的则不可被重写. 存储属性不可以被calass修饰
属性观察期:可以在子类中为计算属性和存储属性添加属性观察,
不希望继承重写用final修饰
9.1内存结构
前八个字节存放类的基本信息,通过八个字节指向堆空间的一段内存,可以找到方法实现。接下来的八个字节存放类的引用计数。再往后是类的属性的内存地址。
OC:runtime
swift:通过前八个字节去查找堆上方法的实现
Self.Type/Perosn.self是类的原类其实就是类的对象的前八个字节的内容,通过元类型可以动态创建类的实例;
协议:可以被类、枚举、结构体遵守;可以继承,可以添加属性和方法,可以定义初始化器,协议约定的方法属性必须要实现,协议可以通过 & 组合作为参数的约束条件,类似于 ;
Any\Anyobject\Anyclass:任意类型,任意对象,任意元类对象
以上是关于Unity脚本常用类和类的函数的主要内容,如果未能解决你的问题,请参考以下文章