Unity脚本(一)

news2024/11/16 23:36:31

视频教程:https://www.bilibili.com/video/BV12s411g7gU/?p=112

目录

脚本 

特性 

控制台Console

脚本生命周期

 Assembly-CSharp.dll

调试 

Component


脚本 

脚本是附加在游戏物体上用于定义游戏对象行为指令的代码,需要继承自MonoBehaviour类

编译过程 

源代码(CLS)-->中间语言-->(Mono Runtime)-->机器码

脚本与对象 

脚本:在Project中创建的cs文件,是一个类

对象:当脚本挂载至某一游戏对象上时,该组件可被视作该类(脚本)的实例化对象

游戏对象挂载的各种组件均是该类(脚本)的引用

特性 

在脚本中编写的字段与在编译器中显示的关系 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Demo : MonoBehaviour
{
    [SerializeField]
    private int a;
    [HideInInspector]
    private int b;
    [Range(0, 100)]
    public float c;
}

 

[SerializeField] 序列化字段作用:在编辑器中显示私有变量

[Hidelnlnspector]∶在编译器中隐藏字段

[Range]∶限定取值范围

控制台Console

Clear:清除所有信息 

1.Clear on Play:播放时清空消息

2.Clear on Build:在构建项目时清空控制台

3.Clear on Recompile:在编译时清空控制台

Collapse:折叠相同消息

Error Pause:如果异常暂停执行

接下来从左至右依次消息开关警告开关错误开关

脚本生命周期

初始阶段

Awake 唤醒: 当物体载入时立即调用1次;常用于在游戏开始前进行初始化,可以判断当满足某种条件执行此脚本this.enable=true

ps:脚本生命周期是一个子线程,这个线程专门调用游戏对象被创建时的方法,所以Awake()和脚本对象的启用无关 

OnEnable 启用:每当脚本对象启用时调用

Start 开始:物体载入且脚本对象启用时被调用1次。常用于数据或游戏逻辑初始化,执行时机晚于Awake(先所有的Awake后Start)

ps:无需在unity脚本中使用属性和构造函数,因为属性在组件中不可见,而构造函数的初始化工作由Awake和Start代替,且构造函数中无法调用Unity相关API

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Demo : MonoBehaviour
{
    public Demo(){
        Debug.Log("构造函数");
        print(Time.time);
    }
}

执行结果如下,构造函数被执行两次,且在输出Time.time时报错 

而对于静态构造函数,静态构造函数在该类第一次被访问时调用,任何使用该类的操作都会引发静态构造函数的执行。静态构造函数是线程安全的,并且是单例的。当用在泛型类中时,静态构造函数对于泛型的每个实例化都调用一次

物理阶段 

FixedUpdate 固定更新:脚本启用后,固定时间间隔被调用,适用于对游戏对象做物理操作,例如移动等

ps:设置更新频率:Edit-->Project Setting-->Time-->Fixed Timestep,默认为0.02s 

OnCollisionXXX 碰撞:当满足碰撞条件时调用

OnTriggerXXX 触发:当满足触发条件时调用。

输入事件 

OnMouseEnter 鼠标移入:鼠标移入到当前Collider时调用

OnMouseOver鼠标经过:鼠标经过当前Collider 时调用

OnMouseExit 鼠标离开:鼠标离开当前Collider 时调用

OnMouseDown 鼠标按下:鼠标按下当前Collider 时调用

OnMouseUp 鼠标抬起:鼠标在当前Collider上抬起时调用

游戏逻辑 

Update 更新:脚本启用后,每次渲染场景时调用,频率与设备性能及渲染量有关

LateUpdate 延迟更新:在Update 函数被调用后执行,适用于跟随逻辑

场景渲染 

OnBecameVisible 当可见:当Mesh Renderer在任何相机上可见时调用

OnBecameInvisible 当不可见:当Mesh Renderer在任何相机上都不可见时调用

结束阶段

OnApplicationQuit 当程序结束:应用程序退出时被调用 

OnDisable 当不可用:对象变为不可用或附属游戏对象非激活状态时此函数被调用

OnDestroy 当销毁:当脚本销毁或附属的游戏对象被销毁时被调用

编写脚本Lifecycle,分别将其挂载至Main Camera和Directional Light

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lifecycle : MonoBehaviour
{
    //创建游戏对象-->立即执行
    void Awake()
    {
        Debug.Log("Awake--" + Time.time + "--" + this.name);
    }

    //创建游戏对象-->脚本启用-->执行
    void Start()
    {
        Debug.Log("Start--" + Time.time + "--" + this.name);
    }

    //每隔0.02s执行
    //物理相关,不受到渲染影响
    void FixedUpdate()
    {
        Debug.Log(Time.time);
    }

    void OnMouseDown()
    {

    }

    //渲染帧执行,执行间隔不固定
    //游戏逻辑
    void Update()
    {
        
    }
}

两个游戏对象的Awake()先于Start()执行,同时可以发现FixedUpdate每隔0.02s被调用一次

 Assembly-CSharp.dll

Assembly-CSharp.dll位于:项目名称\Library\ScriptAssemblies

使用dnSpy打开即可查看项目中创建的所有脚本

dnSpy下载:https://github.com/dnSpy/dnSpy/releases

Debug.Log与print

Debug是一个密闭的类,而print是MonoBehaviour的一个成员;使用print必须要继承 MonoBehaviour类,而 Debug不用

public static void print(object message)
{
     Debug. Log(message);
}

参考博客:https://blog.csdn.net/qq_42351033/article/details/83990499

调试 

编写测试脚本_Debug并将其挂载至某一游戏对象上 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class _Debug : MonoBehaviour
{
    public float t;
    void Update()
    {
        t= Time.time;
    }
}

运行场景并暂停 

双击脚本进入VS并点击上方的附加到Unity

设置断点

 回到unity点击逐帧执行后弹回VS,即可发现下方的自动窗口显现相关数据

点击上方的继续弹回unity并点击逐帧执行,再次弹回VS发现脚本的数据发生改变

Component

挂载的组件均继承自Component 

创建一个命名为parent作为的父物体,然后为其创建三个子物体分别命名为child 1、child 2、child 3,之后分别为child 1和child 2创建子物体并分别命名为_child 1和_child 2

编写如下脚本并挂载至parent 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ComponentDemo : MonoBehaviour
{
    void OnGUI() {
        if(GUILayout.Button("transform")){
            this.transform.position=new Vector3(0,0,10);
        }
        if(GUILayout.Button("toRed")){
            this.GetComponent<MeshRenderer>().material.color=Color.red;
        }
        if(GUILayout.Button("getAllComponents")){
            foreach(var item in this.GetComponents<Component>()){
                Debug.Log(item);
            }
        }
        if(GUILayout.Button("getAllComponentsInChildren")){
            foreach(var item in this.GetComponentsInChildren<MeshRenderer>()){
                Debug.Log(this.name+"--"+item);;
                item.material.color=Color.red;
            }
        }
        if(GUILayout.Button("getComponentInChildren")){
            this.GetComponentInChildren<MeshRenderer>().material.color=Color.red;
        }
    }

    void Reset() {
        this.GetComponent<MeshRenderer>().material.color=Color.blue;
    }
}

GetCompoment<T>():获取当前游戏对象的T组件,若无则返回null,不会去子物体中去寻找

GetComponents<T>():获取当前游戏对象的所有T组件,返回一个数组 

GetCompomentInChildren<T>() :从当前游戏对象开始,若有直接放回,若无则遍历子物体,直到找到为止(深度优先遍历)

GetComponentsInChildren<T>() :获取当前游戏对象及其子物体的所有T组件

参考博客:https://blog.csdn.net/kaixindragon/article/details/44776451 

 运行后左上角出现四个按钮

transform按钮:将父物体parent及其植物体移动至(0,0,10)

toRed按钮:改变父物体parent材质的颜色

getAllComponents按钮:获取挂载在父物体parent上的所有组件

getAllComponentsInChildren按钮:获取挂载在父物体parent及其子物体上的所有MeshRenderer组件并将改变它们的材质颜色

getComponentInChildren按钮:从父物体parent开始,进行深度优先遍历,找到MeshRenderer组件并将其材质颜色更改为红色(因父物体上挂载了MeshRenderer,故只有父物体parent改变了颜色)

Reset:unity 提供的一个重置功能的函数,该方法只能在编辑模式下使用,如果你的游戏在编辑器里面已经运行了,该方法是不会被调用的(所以Debug.log之类的常用测试方法方法在Reset函数里面调用是无效的)

转自博客:http://t.csdn.cn/pWsLK  

Reset后父物体parent的材质如期变蓝

CompareTag 

官方文档:https://docs.unity.cn/cn/2019.4/ScriptReference/GameObject.CompareTag.html 

public bool CompareTag (string tag) 

检测游戏对象是否使用tag进行了标记

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            Destroy(other.gameObject);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用VTK和Python进行体绘制

使用VTK和Python进行体绘制IntroductionVolume Rendering1. Imports2. Helper-functions3.Options4. Image-Data Input5. Prep-work6. Volume RenderingIntroduction 科学可视化技术是运用计算机图形学、图像处理、计算机视觉等方法&#xff0c;将科学、工程学、医学等计算、测…

亚马逊跨境电商可靠吗?2023年还可以做吗?

新的一年新的打算&#xff0c;不少小伙伴在问&#xff0c;亚马逊跨境电商可靠吗&#xff1f;2023年还可以做亚马逊跨境电商吗&#xff1f;为此我们小编就来简单说说自己的想法吧&#xff01; 亚马逊跨境电商可靠吗&#xff1f; 【回答】&#xff1a;首先我们需要肯定一点的是&…

【Unity3D日常开发】Unity3D中屏蔽不想显示的黄色警告消息

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群&#xff1a;1040082875 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中&#xff0c;会有一些脚本…

在vue项目中使用rem的完整步骤

首先要知道几个概念&#xff1a; 设计稿是物理像素&#xff0c;在移动端上是css像素&#xff0c;1css像素2物理像素/3物理像素&#xff1b; 要想实现一张设计稿的尺寸能在各个移动端上适配&#xff0c;因为不同的移动端的css像素和物理像素比不一样&#xff0c;所以固定的物理…

【前端】Vue项目:旅游App-(1)搭建项目、重置css、配置router和store(pinia)

文章目录创建项目搭建和配置项目&#xff1a;项目目录结构划分重置CSSnormalize.cssreset.css目录结构配置router对应页面组件index.js配置store创建项目 npm init vuelatest本项目相关选择&#xff1a; 安装相关依赖&#xff1a; npm install试着跑一下&#xff1a; npm ru…

提面录取占比:浙大MBA MPA MEM复试中不可忽视的关键因素之一。

对于复试考生来说&#xff0c;单纯的探讨某个专业有多少人报考没有太大意义&#xff0c;单纯的关注这个专业招多少人也没有太多意义&#xff0c;我们要更加关注在复试阶段还能剩余多少录取指标&#xff0c;因为这个才是复试考生直接相关的数据。不同项目和专业间目前对提前批面…

剖析免密登录,集群之间的免密登录

免密登录1.免密登录的原理2.实现2.1首先配置每个节点的hosts文件2.2 在server1生成秘钥2.3了解文件2.4 实验是否可行3.补充1.免密登录的原理 每台主机authorized_keys文件&#xff0c;该文件就是身份验证的钥匙&#xff0c;该文件里如果有另一台主机的公钥&#xff08;id_rsa.…

Pytest自动化测试框架之Allure报告

目录 简介 部署使用 1、安装&#xff1a; 2、基本使用 测试报告 简介 Allure Framework是一种灵活的、轻量级、多语言测试报告工具。 不仅可以以简洁的网络报告形式非常简洁地显示已测试的内容&#xff0c; 而且还允许参与开发过程的每个人从日常执行中提取最大程度的有…

Android设计模式详解之享元模式

前言 享元模式是对象池的一种实现&#xff0c;用来尽可能减少内存使用量&#xff0c;适合用于可能存在大量重复对象的场景&#xff0c;来缓存可共享的对象&#xff1b; 定义&#xff1a;使用共享对象可有效地支持大量的细粒度的对象&#xff1b; 使用场景&#xff1a; 系统…

STM32/51单片机实训day7——电机驱动|ULN2003A步进电机|Proteus电路设计|旋转角度控制函数|驱动函数|Keil5程序设计

目录 1 ULN2003A步进电机简介 2 步进电机电路设计 3 旋转角度控制函数 4 程序设计 motor.c motor.h 前期LCD参考文章&#xff1a;​​​​​​​ 内 容&#xff1a;编程实现控制步进电机旋转不同角度 学 时&#xff1a;3学时 知识点&#xff1a; GPIO配置、步进电机…

【pygame学习_5】窗口设计

1、引言 窗体是游戏的交互界面&#xff0c;一般我们会遇到窗口大小可调&#xff0c;窗口无边框&#xff0c;全屏显示&#xff0c;最小化设计&#xff0c;改名字&#xff0c;换图标等设计需求。 屏幕绘制有如下重要函数&#xff1a; 2、屏幕模式函数 pygame.display.set.mode …

Event Loop

javascript是单线程语言 那么&#xff0c;你可能要问&#xff0c;javascript为什么是单线程&#xff0c;难道不能实现多线程吗&#xff1f; 这跟历史有关系。javascript从诞生的时候就是单线程&#xff0c;原因大概是不想让浏览器变得太复杂&#xff0c;因为多线程需要共享资源…

dark room - 2020 年苹果设计奖得主,一个足够强大的照片视频编辑器

dark room - 2020 年苹果设计奖得主&#xff0c;一个足够强大的照片视频编辑器 2020年苹果设计奖得主 2015年App Store最佳应用 Darkroom 是一个高级照片和视频编辑器。它对业余摄影师来说很容易操作&#xff0c;但对专业摄影师来说足够强大。 下载 ➤ Darkroom 下载安装 ⇲…

七十二——八十八

七十二、JavaScript——面向对象简介 面向对象编程&#xff08;OOP) 1. 程序是干嘛的 - 程序是现实世界的抽象&#xff08;照片就是对人的抽象&#xff09; 2. 对象是干嘛的&#xff1f; - 一个事物抽象到程序后就变成了对象 - 在程序的试接中&#xff0c;一切皆对象 - 一个事物…

来到CSDN一周年(hacker的2022年终总结)

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又一座的高山&#xff0c;那样的人生才是我想要的…

【数据结构】排序算法大总结

文章目录1. 排序的概念及运用2. 常见排序算法的实现2.1 插入排序2.1.1 直接插入排序2.1.2 希尔排序2.2 选择排序2.2.1 直接选择排序2.2.2 堆排序2.3 交换排序2.3.1 冒泡排序2.3.1 快速排序小区间优化hoare版本挖坑法前后指针法2.3.2 快排非递归2.4 归并排序2.4.1 归并排序递归2…

本地缓存天花板-Caffeine

前言 caffeine是一款高性能的本地缓存组件&#xff0c;关于它的定义&#xff0c;官方描述如下&#xff1a; Caffeine is a high performance, near optimal caching library. 翻译过来就是Caffeine是一款高性能、最优缓存库。 同时文档中也说明了caffeine是受Google guava启发…

【Git】一文带你入门Git分布式版本控制系统(分支管理策略、Bug分支)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

Eth04 - Eth分层模块架构和索引方案

文章目录 1 Eth分层模块架构2 索引方案3 发送成功和接收成功回调函数传送门 ==>> AutoSAR入门和实战系列总目录 1 Eth分层模块架构 下面的图片表明了以太网控制器驱动程序和硬件的关系;从EthIf看来,要通过以太网控制器层去访问以太网控制器硬件,以太网控制器层有多…

AcWing1204.错误票据——学习笔记

题目&#xff1a;1204. 错误票据 - AcWing题库https://www.acwing.com/problem/content/description/1206/ import java.util.Scanner;public class Main {public static void main(String args[]){Scanner input new Scanner(System.in);int line input.nextInt();int loseI…