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脚本常用类和类的函数的主要内容,如果未能解决你的问题,请参考以下文章

Swift 结构体和类的区别

C++模板类和类模板

C++ 类和对象

C++ 类和对象

C++ 类和对象

C++类和对象