Unity【入门】脚本基础

news2024/11/15 21:31:51

Unity脚本基础

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

文章目录

      • 1、脚本基本规则
        • 1、创建规则
        • 2、MonoBehavior基类
        • 3、不继承MonoBehavior的类
        • 4、执行的先后顺序
        • 5、默认脚本内容
      • 2、生命周期函数
        • 1、概念
        • 2、生命周期函数有哪些
        • 3、生命周期函数支持继承多态
      • 3、Inspector窗口可编辑的变量
      • 4、Mono中的重要内容
        • 1、重要成员
        • 2、重要方法

1、脚本基本规则

1、创建规则
2、MonoBehavior基类
1、创建脚本继承MonoBehavior,才能挂载在GameObject上

2、继承了MonoBehavior的脚本不能new对象,不能写构造函数

3、继承了MonoBehavior的脚本可以挂载多个,(DisallowMultipleComponent特性除外)

4、继承MonoBehavior的类可以再被继承,遵循多态
3、不继承MonoBehavior的类
1、不能挂载在GameObject上
2、需要new
3、一般是单例模式的类(用于管理模块)或者数据结构类(用于存储数据)
4、不用保留默认出现的函数
4、执行的先后顺序

Execution Order设置

5、默认脚本内容

Editor\Data\Resources\ScriptTemplates

2、生命周期函数

游戏本质是一个循环,一帧就是一次循环
FPS(Frames Per Second)每秒钟帧数
FPS 60 :一秒更新60次画面
人眼可视帧数每秒24
1、概念
所有继承MonoBehavior的脚本最终都会挂载到GameObject游戏对象上
生命周期函数就是该脚本对象依附的GameObject对象从出生到消亡整个生命周期中
会通过反射自动调用的一些特殊函数
    
Unity帮助我们记录了一个GameObject对象依附了哪些脚本
会自动得到这些对象,通过反射去执行一个固定名字的函数
这些固定名字的函数就是生命周期函数
2、生命周期函数有哪些
访问修饰符一般为private和protected
不需要外部调用,Unity调用
对象出生
AWake(调用一次)
	出生时调用,类似构造函数,一个对象只调用一次
OnEnable(激活时调用)
	依附的GameObject对象每次激活时调用
Start(调用一次)
	从自己被创建出来后,第一次帧更新之前调用一个对象只会调用一次
FixedUpdate(循环时调用)
	物理帧更新,固定间隔时间执行,间隔时间可以设置
Update	(循环时调用)
	逻辑帧更新,每帧执行
LateUpdate(循环时调用)
	每帧执行,于Update之后执行
OnDisable (失活时调用)
	依附的GameObject对象每次失活时调用
OnDestroy(调用一次)
	对象销毁时调用,依附的GameObject对象被删除时
对象死亡	
//当对象(自己这个类对象)被创建时,才会调用该声明周期函数
//类似构造函数,在一个类对象创建时进行初始化操作
void Awake()
{
    //打印信息的两种方式
    //1、没有继承MonoBehavior类的时候
    Debug.Log("日志");
    Debug.LogError("err");
    Debug.LogWarning("warning");
    //2、继承了MonoBehavior,有线程的方法
    print("打印信息");
}

//对象激活时,逻辑处理
void OnEnable()
{
    print("OnEnable");
}

//初始化信息,相对Awake晚一点,在对象进行第一次帧更新之前执行
void Start()
{
    print("Start");
}
//用于物理更新,每一帧执行,这里的帧和游戏帧有点不同(可以控制时间默认0.02)
//在project setting中的Time设置

void FixedUpdate()
{
    print("FixedUpdate");
}
//主要用于处理游戏核心逻辑更新的函数
void Update()
{
    print("Update");
}

//一般用来处理摄像机位置更新相关
//Update和LateUpdate之间,Unity进行了一些处理,处理动画相关的更新
void LateUpdate()
{
    print("LateUpdate");
}
//失活时做的处理
void OnDisable()
{
    print("OnDisable");
}
//删除对象时调用
private void OnDestroy()
{
    print("OnDestroy");
}
3、生命周期函数支持继承多态

3、Inspector窗口可编辑的变量

Inspector显示的可编辑内容就是脚本的成员变量

1、私有和保护无法显示编辑

2、让私有的和保护的也可以被显示

加序列化字段特性
[SerializeField]
private int i;
系列化就是把一个对象保存到一个文件或数据库字段中

3、公共的可以显示编辑

4、公共的也不让其显示编辑

加特性
[HideInInspector]
public int i2 = 0;

5、大部分类型都能显示编辑

//可以显示
public int[] array;
public List<int> list;
public E_TestEnum type;
public GameObject gameObj;

//字典Dictionary、自定义类型变量不能显示

6、让自定义类型可以被访问

在自定义的类上面加特性
[System.Serializable]
public struct MyStruct
{
    public string name;
    public int age;
}
//字典Dictionary都不行

7、一些辅助特性

1、分组说明特性 Header
    为成员分组
    [Header("基础属性")]
    public int age;
    public bool sex;
    [Header("战斗属性")]
    public int atk;
    public int def;
2、悬停注释 Tooltip
    为变量添加说明
    [Tooltip("闪避")]
    public int miss;
3、间隔特性 Space
    让两个字段之间出现间隔
    [Space()]
	public int crit;
4、修饰数值的滑条范围 Range
    [Range(0,10)]
    public float luck;
5、多行显示字符串,默认3行 Multiline
    [Multiline()]
    public string tips;
6、滚动条显示字符串,默认三行 TextArea
    [TextArea()]
	public string myLife;
7、为变量添加快捷方法 ContextMenuItem
    参数1:显示按钮名
    参数2;方法名,不能有参数
    [ContextMenuItem("重置钱","Money")]
    public int money;
    private void Money()
    {
        money = 10;
    }
8、为方法添加特性能够在Inspector中执行
    [ContextMenu("测试")]
    private void TestFunc()
    {
        print("测试方法");
        money = 20;
    }

添加特性原理:
    Unity通过反射得到类的信息,然后在Inspector窗口中显示字段信息
    Unity内部通过反射获取字段的特征,当具有一些特殊特性时,便会做相应的处理

注意事项

1、Inspector窗口中的变量关联的就是对象的成员变量,运行时改变他们就是在改变成员变量
2、拖拽到GameObject对象后,再改变脚本中变量默认值,界面上不会改变
3、运行中修改的信息不会保存

4、Mono中的重要内容

1、重要成员
[ContextMenu("我的测试")]
private void TestFunc()
{
    1、获取依附的GameObject
    print(gameObject.name);

    2、获取依附的GameObject的位置信息
    print(transform.position);
    print(transform.eulerAngles);//欧拉角
    print(transform.lossyScale);//缩放大小

    3、获取脚本是否激活
    enabled = false;
    
    4、获取其他的脚本信息
    public Test3 otherTest3;
    //在Unity中相互关联
    [ContextMenu("我的测试")]
    private void TestFunc()
    {
        print(otherTest3.gameObject.name);
        print(otherTest3.transform.position);
    }
2、重要方法

得到依附对象上挂载的其他脚本

1、得到自己挂载的单个脚本 GetComponent

根据脚本名获取,获取失败返回Null
    Test3_null t = this.GetComponent("Test3_null") as Test3_null;
    print(t);
根据Type获取
    t = GetComponent(typeof(Test3_null)) as Test3_null;
    print(t);
根据泛型获取,建议使用泛型,不用二次转换
    t = GetComponent<Test3_null>();
    print(t);
只有能得到场景中别的对象或者对象依附的脚本,就能获取到它的所有信息

2、得到自己挂载的多个脚本

//数组
Test3[] array = GetComponents<Test3>();
print(array.Length);
//List
List<Test3> list = new List<Test3>();
GetComponents<Test3>(list);
print(list.Count);

3、得到子对象挂载的脚本(默认也会找自己是否挂载脚本)

//得子对象得单个脚本
参数false:不找失活,参数true:找失活;不填默认为false
不填默认为false
Test3 t3 = GetComponentInChildren<Test3>();
print(t3);

//得子对象得多个脚本
//数组
Test3[] li1 = GetComponentsInChildren<Test3>();
print(li1.Length);
//List
List<Test3> li2 = new List<Test3>();
GetComponentsInChildren(true,li2);
print(li2.Count);

4、得到父对象挂载的脚本(默认也会找自己是否挂载脚本)

得父类多单个脚本
    t3 = GetComponentInParent<Test3>();
    print(t3);
得父类多个脚本
    //数组
    li1 = GetComponentsInParent<Test3>();
    print(li1.Length);
	//List
    GetComponentsInParent(true, li2);
    print(li2.Count);

5、尝试获取脚本

if (TryGetComponent<Test3>(out t3)) { }

6、思考 this

this 代表依附在GameObject自己这个脚本对象
this.gameObject 代表这个脚本对象依附的GameObject游戏对象
this.transform 代表这个脚本对象依附的GameObject游戏对象的位置相关信息

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

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

相关文章

一个良好的嵌入式系统框架(基于FreeRTOS)

目录 Unix操作系统里的优先级嵌入式系统里的优先级 Unix操作系统里的优先级 在《Unix传奇》中有这样一句话&#xff0c;用户态的进程/线程是三等公民、root线程是二等公民、硬件中断是一等公民。 在操作系统中&#xff0c;"用户态"和"内核态"是两种不同的…

深入Kafka消息分区机制:从原理到实践

深入Kafka消息分区机制&#xff1a;从原理到实践 在现代分布式系统中&#xff0c;如何高效地处理海量数据是一个至关重要的问题。Apache Kafka作为一种高吞吐量的分布式消息系统&#xff0c;广泛应用于日志收集、实时分析等场景。为了保证数据的高效处理和系统的高可扩展性&am…

全新/二手KEITHLEY 2400 数字万用表

吉时利Keithley 2400数字源表&#xff0c;200V&#xff0c;1A&#xff0c;20W Keithley 2400 源表是一款 20W 仪器&#xff0c;可输出和测量 5V&#xff08;输出&#xff09;和 1V&#xff08;测量&#xff09;至 200V DC 的电压以及 10pA 至 1A 的电流。该万用表功能包括高重复…

2024 RCTF WebMisc部分 WP

Misc gogogo 考点:内存取证 得到 gogogo.raw 内存取证的题用volatility和AXIOM结合分析 AXIOM 分析存在云服务 但是百度网盘要密码 https://pan.baidu.com/share/init?surlZllFd8IK-oHvTCYl61_7Kw 发现访问过sqlite数据库 可以尝试提取数据库文件出来 结合 volatility 第…

Flutter基础 -- Dart 语言 -- 列表集合枚举

目录 1. 列表 List 1.1 初始 1.2 声明 1.2.1 自动 1.2.2 定长 1.2.3 生成数据 1.3 属性 1.4 方法 1.4.1 添加 1.4.2 查询 1.4.3 删除 1.4.4 Range 1.4.5 洗牌 1.4.6 排序 1.4.7 复制子列表 1.4.8 操作符 2. 集合 Map 2.1 初始 2.2 声明 2.2.1 松散 2.2.2 …

python-求点积

【问题描述】&#xff1a;给出两个数组&#xff0c;并求它们的点积。 【问题描述】&#xff1a;输入A[1,1,1],B[2,2,2]&#xff0c;输出6,即1*21*21*26。输入A[3,2],B[2,3,3],输出-1&#xff0c;没有点积。 完整代码如下&#xff1a; alist(map(int,input().split())) blist(…

vue路由跳转之【编程式导航与传参】

vue路由有两种跳转方式 ----> 编程式与声明式&#xff0c;本文重点讲解vue路由的【编程式导航 】【编程式导航传参 ( 查询参数传参 & 动态路由传参 ) 】等内容&#xff0c;并结合具体案例让小伙伴们深入理解 &#xff0c;彻底掌握&#xff01;创作不易&#xff0c;需要的…

Maven项目通过maven central 发布到中央仓库 https://repo.maven.apache.org/ 手把手教学 最新教学

一、注册maven central账号 ​ https://central.sonatype.com/publishing/namespaces 我这里直接使用github账号登录 &#xff0c;可以自己注册或者直接使用google账号或者github账号登录 这里github账号登录之后 应该只出现io.github 下面的io.gitee我也验证过 所以这里出…

AltiumDesigner/AD添加数据库连接

1.首先确保本机电脑有无对应的数据库驱动&#xff0c;例如我这边要添加MySQL的数据&#xff0c;则需要首先下载MySQL数据驱动&#xff1a;MySQL :: Download MySQL Connector/ODBC (Archived Versions) 2.运行“odbcad32.exe”&#xff0c;如下图添加对应的数据库配置&#xf…

Python魔法之旅-魔法方法(05)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

openresty(Nginx) 配置 特殊URL 密码访问 使用htpasswd 配置 Basic_Auth登录认证

1 使用htpasswd 生成密码文件.htpasswd是Apache附带的工具。如果没有可以安装。 #centos 8.5 系统 yum install httpd-tools #Ubuntu 24.04 系统 sudo apt update sudo apt-get install apache2-utils #生成密码文件,用户test sudo htpasswd -c /usr/local/openresty/nginx/…

独家首发 | 基于 KAN、KAN卷积的轴承故障诊断模型

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Python轴承故障诊断入门教学-CSDN博客 Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型-CSDN博客 Python轴承故障诊断 (14)高创新故障识别模型-CSDN…

Git使用规范及命令

文章目录 一、Git工作流二、分支管理三、Git命令操作规范1. 切到develop分支&#xff0c;更新develop最新代码2. 新建feature分支&#xff0c;开发新功能3. 完成feature分支&#xff0c;合并到develop分支4. 当某个版本所有的 feature 分支均合并到 develop 分支&#xff0c;就…

【漏洞复现】大华 DSS 数字监控系统 user_edit.action 信息泄露漏洞

0x01 产品简介 大华 DSS 数字监控系统是大华开发的一款安防视频监控系统&#xff0c;拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。 0x02 漏洞概述 大华 DSS 数字监控系统 user_edit.action 接囗处存在信息泄露漏洞。未经身份验证的远程攻击者可利用此漏洞…

无意间看到男主眼神,这也太有感觉了吧❗❗

2025即将首播《藏海传》中国大陆剧情/奇幻/古装共40集。 原本&#xff0c;稚奴身为大雍国钦天监监正蒯铎之子&#xff0c;背负着家族血仇。 历经十年沉默与磨砺&#xff0c;他化名为藏海&#xff08;肖战 饰&#xff09;&#xff0c;重返京城。 他凭借卓越的营造技艺和深谙纵…

gitbook安装 报错处理 windows系统

首先需要有nodejs。若没有&#xff0c;则去nodejs官网下载nodejs安装。 然后安装gitbook。命令如下&#xff1a;这是在linux系统的命令。 $ npm config set registry http://registry.npm.taobao.org #设置一下淘宝镜像&#xff08;非必选&#xff09; $ npm install gitbo…

B站稿件生产平台高可用建设分享

背景 B站作为国内领先的内容分享平台&#xff0c;其核心功能之一便是支持UP主们创作并分享各类视频内容。UP主稿件系统作为B站内容生产的关键环节&#xff0c;承担着从内容创作到发布的全过程管理。为了满足不同创作者的需求&#xff0c;B站提供了多种投稿渠道&#xff0c;包括…

深入探讨 Android 的 View 显示过程与源码分析

文章目录 1. 探讨 Android 的 View 显示过程1.1. onFinishInflate1.2. onAttachedToWindow1.3. onMeasure1.4. onSizeChanged1.5. onLayout1.6. onDraw 2. 系统代码分析1.1. onFinishInflate1.2. onAttachedToWindow1.3. onMeasure1.4. onSizeChanged1.5. onLayout1.6. onDraw …

基于深度学习的端到端语音识别时代

随着深度学习的发展&#xff0c;语音识别由DNN-HMM时代发展到基于深度学习的“端到端”时代&#xff0c;这个时代的主要特征是代价函数发生了变化&#xff0c;但基本的模型结构并没有太大变化。总体来说&#xff0c;端到端技术解决了输入序列长度远大于输出序列长度的问题。 采…

探索k8s集群的存储卷 emptyDir hostPath nfs

目录 一 含义 查看支持的存储卷类型 emptyDir存储卷 1.1 特点 1.2 用途 1.3部署 二、hostPath存储卷 一 含义 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重…