Unity学习part1
课程为b站【Unity教程】零基础带你从小白到超神
1、脚本执行顺序
unity的脚本执行顺序不像blender的修改器那样按顺序执行,而是系统默认给配置一个值,值越小,执行顺序越靠前(注意,这个顺序是全局生效的)

2、初始化内容
脚本要初始化的内容放在awake函数中,onenable是可以反复调用的。unity中执行顺序是先调用所有脚本的awake完后,在按脚本执行顺序调用其他脚本中的onenable等函数
3、标签与图层
图层用于碰撞检测,例如将一组物体图层设置为CHARACTER,这样可以让相机在剔除遮罩时,选择CHARACTER图层不进行拍摄,使物体在玩家眼中隐形。可以理解为:标签是开发者给物体分组便于理解的,例如将物体分为敌人,玩家等;而图层是显示分类,给相机使用的


4、预设体
prefab是预设体资产。如果物体变蓝,说明它是与某个预设体相关。物体可以拖到项目栏中生成预设体资产。预设体资产与游戏中物体相当于类与实例的关系,但游戏资产自行更改数值之后,预设体资产的改动就不会影响到游戏体。物体上修改了并且没有将修改应用到预制体上,预制体无法对对应的参数进行修改,即关于此参数,预制体与游戏物体脱钩。

如果需要游戏资产的更改能够影响到预设体,则需要通过打开按钮进行修改(保证游戏物体与预制体参数的关联)

或者通过应用到预制件来进行修改(保证游戏物体与预制体参数的关联)
游戏物体添加组件时,组件会显示一个+号,代表预制体资产里没有。可以通过感叹号右键或者覆盖按钮来应用到预制体组件
预制体变体与预制体资产之间才是继承关系,即预制体修改,预制体变体随之修改。而预制体变体修改,预制体不会变化。并且预制体变体和预制件之间不存在应用关系


5、vector3
向量vector3可以代表向量、坐标、缩放、旋转
6、四元数与欧拉角的转换
Vector3 rotate = new Vector3(0,30,0);Quaternion quaternion = Quaternion.identity;// 欧拉角转换为四元数quaternion = Quaternion.Euler(rotate);//四元数转换为欧拉角rotate = quaternion.eulerAngles;//看向一个物体quaternion = Quaternion.LookRotation(rotate);
7、DEBUG方法
打印日志
Debug.LogWarning("");
Debug.Log("");
Debug.LogError("");
画一条线

// (起点,终点,颜色)
Debug.DrawLine(Vector3.zero,Vector3.one);
画一条射线,并区分线与射线的区别

8、物体的激活状态
public class test2 : MonoBehaviour
{public GameObject cube2;// Start is called before the first frame updatevoid Start(){//立方体的名称Debug.Log(cube2.name);//当前真正的激活状态Debug.Log(cube2.activeInHierarchy);//当前自身激活状态Debug.Log(cube2.activeSelf);}// Update is called once per framevoid Update(){}
}



public class test2 : MonoBehaviour
{public GameObject cube2;//获取预设体public GameObject preFab;// Start is called before the first frame updatevoid Start(){//立方体的名称Debug.Log(cube2.name);//当前真正的激活状态Debug.Log(cube2.activeInHierarchy);//当前自身激活状态Debug.Log(cube2.activeSelf);//获取transform组件Transform trans = this.transform;Debug.Log(transform.position);//获取其他组件BoxCollider bc = GetComponent<BoxCollider>();//获取当前物体子物体身上的某个组件GetComponentInChildren<CapsuleCollider>();//获取当前物体父物体身上的某个组件GetComponentInParent<BoxCollider>();//给当前物体添加一个组件gameObject.AddComponent<AudioSource>();//给特定物体添加组件cube2.AddComponent<AudioSource>();//通过游戏物体的名称获取游戏物体GameObject test = GameObject.Find("Test");Debug.Log(test.name);Debug.Log("11111");//通过游戏标签获取游戏物体GameObject[] test2 = GameObject.FindGameObjectsWithTag("Enemy");// 设置激活状态test2[0].SetActive(false);Debug.Log(test2[0].name);//通过预设体资产来实例化一个物体Instantiate(preFab);//生成的游戏物体可以被当成当前物体的子物体Instantiate(preFab, this.transform);//实例化一个物体并放置在固定位置并作旋转//GameObject go =Instantiate(preFab,Vector3.zero, Quaternion.identity);//销毁//Destroy(go);}// Update is called once per framevoid Update(){}
}


9、时间类
public class TimeTest : MonoBehaviour
{float timer = 0;// Start is called before the first frame updatevoid Start(){//游戏开始到现在所花的时间Debug.Log(Time.time);//时间缩放值 游戏的加速减速暂停等功能Debug.Log(Time.timeScale);//固定时间间隔 与FixUpdate()函数相关Debug.Log(Time.fixedDeltaTime);//上一帧到这一帧所用的游戏时间Debug.Log(Time.deltaTime);}//60帧 1/60 120帧 1/120// Update is called once per framevoid Update(){//相当于一个计时器,将每一帧帧运行时间相加.作用-->旅行者,请在3秒内开启宝箱timer = timer + Time.deltaTime;//上一帧到这一帧所用的游戏时间,可用来帧率测试//Debug.Log(Time.deltaTime);//如果大于十秒if (timer > 3){Debug.Log("> 3");}}
}

10、Application类的常用属性方法
public class ApplicationTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//游戏数据文件夹路径(只读,加密压缩)Debug.Log(Application.dataPath);//持久化文件夹路径,对应不同系统(MAC,WINDOWS,LINUX)。游戏存档存放位置Debug.Log(Application.persistentDataPath);//StreamingAssets文件夹路径,需手动建立该文件夹。(只读,不加密,放游戏的配置文件或一些不需要加密的二进制文件,所有人可看)Debug.Log(Application.streamingAssetsPath);//临时文件夹Debug.Log(Application.temporaryCachePath);//控制是否在后台运行Debug.Log(Application.runInBackground);//打开urlApplication.OpenURL("https://www.bilibili.com/");//退出游戏Application.Quit();}// Update is called once per framevoid Update(){}
}

垃圾window还是默认我工程项目放在appdata下,得想个法子改一下,不然c盘逐渐增加
11、加载场景(同步)




public class SceneTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//两个类 场景类、场景管理类// SceneManager.LoadScene(1);//通过索引//SceneManager.LoadScene("MyScene"); //通过名称//获取当前场景Scene scene = SceneManager.GetActiveScene();//场景名称Debug.Log(scene.name);//场景是否已经被加载Debug.Log(scene.isLoaded);//场景路径Debug.Log(scene.path);//场景索引Debug.Log(scene.buildIndex);//获取场景中所有的根游戏物体GameObject[] objects = scene.GetRootGameObjects();Debug.Log(objects.Length);//场景管理类//当前加载的活动场景数量Debug.Log(SceneManager.sceneCount);//创建新场景,场景同一个时间并不是只能存在一个 是可以同时存在的,可以用于时空关卡切换,关卡叠加Scene scene1 = SceneManager.CreateScene("newScene");Debug.Log("创建场景");//已加载场景个数Debug.Log(SceneManager.sceneCount);//卸载场景SceneManager.UnloadSceneAsync(scene1);Debug.Log("卸载场景");Debug.Log(SceneManager.sceneCount);//加载场景//SceneManager.LoadScene("MyScene",LoadSceneMode.Single); //替换形式加载SceneManager.LoadScene("MyScene", LoadSceneMode.Additive);//加载出的场景与原本场景融合在一起。场景大的会可能会造成卡顿}// Update is called once per framevoid Update(){}
}
12、加载场景(异步)
异步 c#通过多线程实现的;而unity还提供了协程的方式来实现异步
public class AsyncTest : MonoBehaviour
{AsyncOperation op1;// Start is called before the first frame updatevoid Start(){//协程需要使用StartCoroutine方法StartCoroutine(loadScene());Debug.Log("加载完成");}//携程方法用来异步加载场景IEnumerator loadScene(){op1 = SceneManager.LoadSceneAsync(1);// 加载完场景不要自动跳转,让玩家手动确认再跳转op1.allowSceneActivation = false;yield return op1; }float timer = 0;// Update is called once per framevoid Update(){//输出加载进度 数值范围为0-0.9Debug.Log(op1.progress);timer += Time.deltaTime;if (timer > 5){op1.allowSceneActivation = true;}}
}

可以看到,MyScene关卡还在加载中
可以看到,因为异步,所以加载完成日志先打印
13 、transform组件
游戏物体的父子关系是由transform组件所关联起来的
public class TransformTest : MonoBehaviour
{// Start is called before the first frame updatevoid 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); //只有相对于父物体的缩放,没有相对于世界的缩放//向量,注意 物体旋转时,xyz轴指向也会发生变化。相当于获取红绿蓝三个轴的向量,z轴一般代表前方轴,红色轴代表右手轴,y轴代表上方Debug.Log("forward is " + transform.forward);Debug.Log("right is " + transform.right);Debug.Log("up is " + transform.up);//父子关系//获取父物体//Debug.Log(transform.parent.gameObject);//获取子物体个数//Debug.Log(transform.childCount);//解除与子物体的父子关系//transform.DetachChildren();//获取子物体Transform trans = transform.Find("Child");trans = transform.GetChild(0);//判断一个物体是不是另一个物体的子物体bool res = trans.IsChildOf(transform);Debug.Log("IsChildOf is " + res);//设置为父物体.这个函数可以让原本不相干的两个物体变成父子关系trans.SetParent(transform);}// Update is called once per framevoid Update(){//让一个物体时时刻刻看向另一个物体,举例看向000。即让物体的z轴时刻指向000。可以用于索敌//transform.LookAt(Vector3.zero);//旋转 按什么轴旋转,每一帧旋转多少度。可用于游戏开发的某种场景物体自旋转。//transform.Rotate(Vector3.up, 1);//绕某个物体旋转。也可以绑定父物体然后用脚本transform.Rotate让父物体自转//绕000点的up轴,每一帧旋转五度(但如果按帧的话 不同设备间帧率有差 可能会导致不同设备上效果不同,可以选用秒单位//transform.RotateAround(Vector3.zero, Vector3.up, 5);//移动 每一帧向前移动0.1,可用于弹道轨迹//transform.Translate(Vector3.forward * 0.0001f);}
}
14、基本键鼠操作
public class KeyTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//键盘鼠标操作需要每一帧都判断//鼠标的点击, 0 左键 1 右键 2 滚轮.if (Input.GetMouseButtonDown(0)){//持续按下也只会触发一个buttondown事件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(KeyCode.A)){Debug.Log("持续按下A");}//抬起键盘按键if (Input.GetKeyUp(KeyCode.A)) //也可以用小写字符"a",大写字符"A"会报错{Debug.Log("松开A");}}
}
15、虚拟轴

用键盘模拟摇杆.为了跨平台输入监听。不是全部设备都有键盘字母的

只有水平和垂直时虚拟轴,其他是虚拟按键
public class AxisTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){// 获取水平轴,通过输入轴的名称, 轴的名称在项目设置-》输入管理器中定义。按下什么健或鼠标可以在设置中定义float horizontal = Input.GetAxis("Horizontal");float vertical = Input.GetAxis("Vertical");//Debug.Log(horizontal + " " + vertical);//虚拟按键if(Input.GetButtonDown("Jump")){Debug.Log("空格");}if (Input.GetButton("Jump")){Debug.Log("持续空格");}if (Input.GetButtonUp("Jump")){Debug.Log("松开空格");}}
}
16、触摸屏操作
public class TouchTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){//开启多点触摸Input.multiTouchEnabled = true;}// Update is called once per framevoid Update(){//判断单点触摸if(Input.touchCount == 1){//触摸对象Touch touch = Input.touches[0];//触摸位置Debug.Log(touch.position);//触摸阶段switch(touch.phase){case TouchPhase.Began:break;case TouchPhase.Moved:break;case TouchPhase.Stationary:break;case TouchPhase.Ended:break;case TouchPhase.Canceled:break;}}//判断多点触摸if (Input.touchCount == 2){Touch touch = Input.touches[0];Touch touch1 = Input.touches[1];}}
}
相关文章:
Unity学习part1
课程为b站【Unity教程】零基础带你从小白到超神 1、脚本执行顺序 unity的脚本执行顺序不像blender的修改器那样按顺序执行,而是系统默认给配置一个值,值越小,执行顺序越靠前(注意,这个顺序是全局生效的) …...
【AI知识点】Adversarial Validation(对抗验证)
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】【AI应用】 Adversarial Validation(对抗验证) 是一种用于检查 训练集(Train Set)和测试集(Test Set)是否同分布 的方法。它…...
力扣 15.三数之和
题目: 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的…...
Spring boot中实现字典管理
数据库脚本 CREATE TABLE data_dict (id bigint NOT NULL COMMENT 主键,dict_code varchar(32) DEFAULT NULL COMMENT 字典编码,dict_name varchar(64) DEFAULT NULL COMMENT 字典名称,dict_description varchar(255) DEFAULT NULL COMMENT 字典描述,dict_status tinyint DEFA…...
唯一值校验的实现思路(续)
本文接着上一篇文章《唯一值校验的实现思路》,在后端实现唯一值校验。用代码实现。 /*** checkUniqueException[唯一值校验]** param entity 新增或编辑的学生实体* param insert 是否新增,如果是传入true;反之传入false* return void* date…...
【AI论文】10亿参数大语言模型能超越405亿参数大语言模型吗?重新思考测试时计算最优缩放
摘要:测试时缩放(Test-Time Scaling,TTS)是一种通过在推理阶段使用额外计算来提高大语言模型(LLMs)性能的重要方法。然而,目前的研究并未系统地分析策略模型、过程奖励模型(Process …...
Ubuntu20.04上搭建nginx正向代理提供上网服务
背景:公司很多电脑因软件管控问题不得不禁止设备上网,现需搭建上网代理服务器提供给这些用户使用。 操作系统:ubuntu20.04 工具:nginx-1.25.4 1、下载nginx安装包及依赖 由于nginx默认只持支持转发http协议,所以如…...
web前端布局--使用element中的Container布局容器
前端页面,跟Qt中一样,都是有布局设置的。 先布局,然后再在各布局中添加显示的内容。 Element网站布局容器:https://element.eleme.cn/#/zh-CN/componet/container 1.将element相应的布局容器代码layout,粘贴到vue项…...
使用 PDF SDK 通过页面分割和数据提取对建筑图纸进行分类
一家专门从事设计和建设的建筑公司对大量多页建筑 PDF 图纸进行分类,从而提高协作和运营效率。 这类公司通常承担多个建筑设计项目,每个项目包含多个设计图纸,如详细的结构计划、电气与水管计划、机械计划等。如果项目图纸可以在上传后自动分…...
Linux命名管道与共享内存
命名管道与共享内存 命名管道介绍和基本使用 理解了匿名管道后,命名管道的理解就会变得容易。在前面使用匿名管道时可以发现,之所以可以匿名是因为由父进程创建,子进程拷贝所以子进程和父进程都可以看到这个管道。但是如果对于任意两个进程…...
maven web项目如何定义filter
在 Maven Web 项目中定义一个 Servlet 过滤器(Filter),需要遵循 Java Servlet 规范,并利用 Maven 来管理项目结构和依赖。下面是如何在 Maven Web 项目中定义和配置一个过滤器的基本步骤: 1. 创建过滤器类 首先&…...
使用 Notepad++ 编辑显示 MarkDown
Notepad 是一款免费的开源文本编辑器,专为 Windows 用户设计。它是替代记事本(Notepad)的最佳选择之一,因为它功能强大且轻量级。Notepad 支持多种编程语言和文件格式,并可以通过插件扩展其功能。 Notepad 是一款功能…...
@synchronized的使用
synchronized 介绍 synchronized 是 Objective-C 提供的一种 互斥锁(Mutex),它用于确保一段代码在同一时间只有一个线程能执行,避免多线程访问共享资源时出现数据竞争。 基本语法 synchronized (lockObject) {// 需要加锁的代码…...
解锁Rust:融合多语言特性的编程利器
如果你曾为理解Rust的特性或它们之间的协同工作原理而苦恼,那么这篇文章正是为你准备的。 Rust拥有许多令人惊叹的特性,但这些特性并非Rust所独有。实际上,Rust巧妙地借鉴了众多其他语言的优秀特性,并将它们融合成了一个完美的整体。深入了解Rust这些重要特性的来源以及它是…...
zyNo.23
SQL注入漏洞 1.SQL语句基础知识 一个数据库由多个表空间组成,sql注入关系到关系型数据库,常见的关系型数据库有MySQL,Postgres,SQLServer,Oracle等 以Mysql为例,输入 mysql-u用户名-p密码 即可登录到MySQL交互式命令行界面。 既然是…...
visual studio 在kylin v10上跨平台编译时c++标准库提示缺少无法打开的问题解决
情况1:提示无法打开 源文件 "string"之类导致无法编译 情况2:能编译,但无法打开这些库文件或标准库使用提示下划红色问题 解决方案: 一、通过工具->选项->跨平台里,在“远程标头IntelliSense管理器”更新下载一下…...
黑马Mistral Le chat逆转deepseek
法国人工智能聊天机器人出来了。 Mistral AI比deepseek 性能快很多,准确率更高,非常好用。 全新的发现! 站在老美已经出来的方法&理论上,感觉有0.2亿美金和有gpu算力,感觉搞一个超越国内deepseek难道其实…...
Spring Cloud — 深入了解Eureka、Ribbon及Feign
Eureka 负责服务注册与发现;Ribbon负责负载均衡;Feign简化了Web服务客户端调用方式。这三个组件可以协同工作,共同构建稳定、高效的微服务架构。 1 Eureka 分布式系统的CAP定理: 一致性(Consistency)&am…...
Web项目测试专题(六)压力测试
概述: 压力测试检验Web应用在高并发、高负载情况下的表现,帮助预估系统承载能力和发现瓶颈 步骤: 并发用户测试:增加虚拟用户数测试系统在多人同时使用时的表现 负载测试:模拟高负载情况测试系统的稳定性和响应时间…...
2.5 使用注解进行单元测试详解
Mockito 使用注解进行单元测试详解 Mockito 提供了一系列注解来简化测试代码的编写,减少手动创建和管理 Mock 对象的样板代码。结合 JUnit 5,可以更高效地构建清晰、易维护的单元测试。 1. 核心注解概览 注解作用Mock创建并注入一个 Mock 对象…...
2025年SEO工具有哪些?老品牌SEO工具有哪些
随着2025年互联网的发展和企业线上营销的日益重要,SEO(搜索引擎优化)逐渐成为了提高网站曝光率和流量的重要手段。SEO的工作不仅仅是简单地通过关键词优化和内容发布就能够实现的,它需要依赖一系列专业的SEO工具来帮助分析、监测和…...
使用 React 16+Webpack 和 pdfjs-dist 或 react-pdf 实现 PDF 文件显示、定位和高亮
写在前面 在本文中,我们将探讨如何使用 React 16Webpack 和 pdfjs-dist 或 react-pdf 库来实现 PDF 文件的显示、定位和高亮功能。这些库提供了强大的工具和 API,使得在 Web 应用中处理 PDF 文件变得更加容易。 项目设置 首先,我们需要创建…...
LabVIEW显微镜成像偏差校准
在高精度显微镜成像中,用户常常需要通过点击图像的不同位置,让电机驱动探针移动到指定点进行观察。然而,在实际操作中,经常会遇到一个问题:当点击位于图像中心附近的点时,探针能够相对准确地定位࿱…...
【Elasticsearch】文本分析Text analysis概述
文本分析概述 文本分析使 Elasticsearch 能够执行全文搜索,搜索结果会返回所有相关的结果,而不仅仅是完全匹配的结果。 如果你搜索“Quick fox jumps”,你可能希望找到包含“A quick brown fox jumps over the lazy dog”的文档,…...
23页PDF | 国标《GB/T 44109-2024 信息技术 大数据 数据治理实施指南 》发布
一、前言 《信息技术 大数据 数据治理实施指南》是中国国家标准化管理委员会发布的关于大数据环境下数据治理实施的指导性文件,旨在为组织开展数据治理工作提供系统性的方法和框架。报告详细阐述了数据治理的实施过程,包括规划、执行、评价和改进四个阶…...
AI代码生成器如何重塑前端开发的工作环境
近年来,人工智能(AI)技术迅猛发展,深刻地改变着各行各业的工作方式。在软件开发领域,AI写代码工具的出现更是掀起了一场革命,尤其对前端开发工程师的工作环境和协作方式产生了深远的影响。本文将深入探讨AI…...
kafka的架构和工作原理
目录 Kafka 架构 Kafka 工作原理 Kafka 数据流 Kafka 核心特性 总结 Kafka 架构 1. 生产者(Producer) 2. 消费者(Consumer) 3. 主题(Topic) 4. 分区(Partition) 5. 副本(Replica) 6. 代理(Broker) 7. ZooKeeper(旧版本)/KRaft(新版本) Kafka 工作…...
Xcode证书密钥导入
证书干嘛用 渠道定期会给xcode证书,用来给ios打包用,证书里面有记录哪些设备可以打包进去。 怎么换证书 先更新密钥 在钥匙串访问中,选择系统。(选登录也行,反正两个都要导入就是了)。 mac中双击所有 .p12 后缀的密钥ÿ…...
索引的详细介绍
数据库索引是一种用于加速数据检索的数据结构,类似于书籍的目录。通过索引,数据库可以快速定位数据,而无需扫描整个表。以下是关于数据库索引的详细介绍: 1. 索引的基本概念 定义:索引是数据库表中一列或多列的值及其…...
Python 基于 OpenCV 的人脸识别上课考勤系统(附源码,部署教程)
博主介绍:✌2013crazy、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&a…...
