Unity【入门】脚本基础

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游戏对象的位置相关信息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

thinkphp6 queue队列的maxTries自定义

前景需求&#xff1a;在我们用队列的时候发现maxtries的个数时255次&#xff0c;这个太影响其他队列任务 我目前使用的thinkphp版本是6.1 第一部定义一个新的类 CustomDataBase&#xff08;我用的mysql数据库存放的队列&#xff09; 重写__make 和createPlainPayload方法 …

第10周 企业认证、分布式事务,分布式锁方案落地

第10周 企业认证、分布式事务&#xff0c;分布式锁方案落地 ********************************************************************************************** 本周我们将对企业入驻认证的流程进行落地&#xff0c;并且结合分布式缓存中间件Redis与Redisson进行相关的技术方…

Easy RoCE:在SONiC交换机上一键启用无损以太网

RDMA&#xff08;远程直接内存访问&#xff09;技术是一种绕过 CPU 或操作系统&#xff0c;在计算机之间直接传输内存数据的技术。它释放了内存带宽和 CPU&#xff0c;使节点之间的通信具有更低的延迟和更高的吞吐量。目前&#xff0c;RDMA 技术已广泛应用于高性能计算、人工智…

web项目规范配置(husky、eslint、lint-staged、commit)

背景&#xff1a; 团队开发为了保证提交代码格式统一&#xff0c;通常在进行代码提交的时候对暂存区代码进行校验&#xff0c;如没有通过eslint(本例使用eslint)校验&#xff0c;则不能提交到远端。 安装依赖 husky 、eslint 、prettier 、lint-staged npm install husky e…

【Uniapp小程序】自定义导航栏uni-nav-bar滚动渐变色

效果图 新建activityScrollTop.js作为mixins export default {data() {return {navBgColor: "rgba(0,0,0,0)", // 初始背景颜色为完全透明navTextColor: "rgba(0,0,0,1)", // 初始文字颜色};},onPageScroll(e) {// 设置背景const newAlpha Math.min((e.s…

手机耳机哪个品牌音质好

在寻找音质出色的手机耳机时&#xff0c;品牌选择显得尤为重要。市场上众多知名品牌提供了各式各样的耳机产品&#xff0c;它们在音质、降噪功能、设计等方面各有千秋。以下是一些在音质上表现优异的手机耳机品牌的分析&#xff1a; 索尼&#xff1a;索尼的耳机以其卓越的降噪技…

Django企业招聘后台管理系统开发实战四

前言 首先我们看一下产品的需求背景&#xff0c;这个产品为了解决招聘面试的过程中&#xff0c;线下面试管理效率低&#xff0c;面试过程和结果不方便跟踪的痛点 招聘管理的系统几乎是每一家中小公司都需要的产品 我们以校园招聘的面试为例子来做 MVP 产品迭代 首先我们来看一下…

【网络安全的神秘世界】在win11搭建pikachu靶场

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 下载pikachu压缩包 https://github.com/zhuifengshaonianhanlu/pikachu 下载好的pikachu放在phpstudy_pro/www目录下 创建pikachu数据库 打开phpstudy软件…

容量为0多线程操作的SynchronousQueue(FIFO)

一:简介 SynchronousQueue是一个没有数据缓冲的BlockingQueue,生产者线程对其的插入操作put必须等待消费者的移除操作take。SynchronousQueue的优点在于其直接性和高效性,它实现了线程间的即时数据交换,无需中间缓存,确保了数据传输的实时性和准确性,同时,其灵活的阻塞机…

恒压频比开环控制系统Matlab/Simulink仿真分析(SVPWM控制方式)

一、SVPWM 交流电机需要输入三相正弦电流的最终目的就是在电机空间形成圆形磁场&#xff0c;从而产生恒定的电磁转矩。把逆变器和交流电机视为一个整体&#xff0c;以圆形旋转磁场为目标来控制逆变器的工作&#xff0c;这种控制方法称为“磁链跟踪控制”&#xff0c;磁链轨迹的…

洛谷P1035 级数求和 题解

#题外话&#xff08;第42篇题解&#xff09; #先看题目 题目链接https://www.luogu.com.cn/problem/P1035#思路 没啥思路&#xff0c;这其实偏向模拟一点&#xff0c;按照题目说的做就行了。 #代码 原来是这个熊样的&#xff08;都能AC&#xff0c;优化的问题&#xff09; …

九阳股份的“而立危机”:业绩三连降,押注清洁赛道迷雾重重?

“致敬伟大的小问题”&#xff0c;这是步入而立之年的九阳股份&#xff08;SZ:002242&#xff0c;下同“九阳”&#xff09;新品发布会的主题&#xff0c;也是九阳过去30年发展历程的缩影。 在经历“宅经济”催生的流量井喷期后&#xff0c;厨房小家电市场受困于热度退潮的浅滩…

【spring】Spring Boot3.3.0发布啦

spring最新版本 springboot官网&#xff1a;Spring Boot :: Spring Boot Spring Boot 3.3 发行说明&#xff1a;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.3-Release-Notes 开发环境的要求对比表 Spring BootJDKSpringMavenGradle3.3.017 ~ 226.1…

《Ai企业级知识库》rasa-action编写顺序+实体拿取+rasa-X替代品+使用mysql作为知识库存储,根据知识库中数据回答

rasa-X替代-&#xff08;预留坑位&#xff09; GitHub - nesterapp/rasa-admin: An open-source alternative for Rasa-X 识别意图 小鸭子&#xff1a;ner_duckling(组件) 查找表&#xff1a;lookup tables ner_crf &#xff08;可以是那种可列举的列表类型&#xff09; 定…

C# 类型系统

1. 隐式类型 c#允许使用 var 声明变量&#xff0c;编译期会通过初始化语句右侧的表达式推断出变量的类型。 // i is compiled as an int var i 5;// s is compiled as a string var s "Hello";// a is compiled as int[] var a new[] { 0, 1, 2 };// expr is co…

TLS 协议流程

TLS 协议流程 背景简介TLS-RSATLS-DH总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内容并非完全…

某咨询公司的大数据解决方案介绍(32页PPT)

方案介绍&#xff1a; 本咨询公司的大数据平台解决方案以企业实际需求为出发点&#xff0c;结合先进的大数据技术和行业经验&#xff0c;为企业提供一站式的大数据服务。通过实时数据收集与处理、深度数据分析与挖掘、可视化数据展示以及灵活的数据应用与扩展&#xff0c;帮助…

探索Web3工具:正确使用区块链平台工具的秘诀

在当今日新月异的数字时代&#xff0c;区块链技术正以惊人的速度改变着我们的生活和工作方式。尤其对于那些想要踏入区块链世界的人来说&#xff0c;正确使用区块链平台工具至关重要。本文将向您介绍一些关键的Web3工具&#xff0c;并以TestnetX.com为例&#xff0c;展示如何利…

输入输出安全防护指南

输入输出安全防护指南 在现代网络应用程序中&#xff0c;输入输出的安全性是至关重要的。未经验证的输入和未编码的输出可能导致严重的安全漏洞&#xff0c;如SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;等。本文将详细讨论如何通过输入验证和输出编码来确保应用程序的…

【工具免费】喜马拉雅 x2m转m4a,xm转mp3的简单方法!

喜马拉雅.xm文件转MP3&#xff0c;阿星来帮忙了&#xff01; 大家好&#xff0c;今天咱们来聊聊一个超级实用的小技巧&#xff0c;特别是对于那些喜马拉雅的忠实听众来说&#xff0c;这绝对是个福音&#xff01; 阿星发现&#xff0c;很多小伙伴们下载的喜马拉雅文件都是.xm格…