Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】
Unity学习参考文档和开发工具
unity的官网文档:https://docs.unity3d.com/cn/current/Manual/ScriptingSection.html
■ 学习方式:
首先了解unity相关概述,快速认识unity编辑器,然后抓住重点的学:游戏对象、组件|C#脚本、预制体、UI
学习过程你会发现,其实Unity中主要是用c#进行开发。
因为在这个过程中,无非就是,对游戏对象通过挂载的C#脚本,修改一下组件的一些属性,控制一下激活之类的操作。到了UGUI,同样,也是通过挂载的C#脚本,监听到事件发生后,调用一下C#脚本定义的方法处理一下事件。
- unity快速上手文档:https://learn.unity.com/tutorial/she-zhi-3d-beginner?uv=2020.3&projectId=5dfa9a5dedbc2a26d1077ca8
- 视频[这种动手类的快速上手,建议跟着视频动手操作一番]:https://www.bilibili.com/video/BV1gQ4y1e7SS/
- ★重点学习内容:游戏对象、组件|C#脚本、预制体、UI[GUI]
■ 开发工具:
unity、visual studio
1、Unity 概述
(1) 什么是Unity
Unity是一套具有完善体系与编辑器的跨平台游戏开发工具,也可以称之为游戏引擎游戏引擎是指一些编写好的可重复利用的代码与开发游戏所用的各功能编辑器Unity目前已超过50%的游戏引擎市场占有率。
游戏引擎=可复用代码+各种开发工具
(2) Unity引擎优势
1.基于C#编程,拥有易上手、高安全性的特性
2.独特的面向组件游戏开发思想让游戏开发更加简单易复用
3.拥有十分成熟的所见即所得开发编辑器
4.拥有良好生态圈,商城中包含大量成熟的功能脚本与资源
5.强大的跨平台特性,可以制作PC、主机、手机、AR、VR等多平台游戏
2、Unity Hub
管理Unity项目,当电脑中有多个unity不同版本的项目的时候,管理就比较麻烦,可以通过unity hub 对各个不同的unity hub项目管理。
3、认识unity编辑器

(1) unity恢复默认窗口: Windows-> Layouts-> Default

(2) 项目设置
- 包括:物理、声音、质量、编辑器设置等等

(3) 全局设置
- 编辑器的常用设置

- 扩展工具,设置一下脚本使用visual studio 打开

(4) unity菜单栏介绍
■ 文件 File:文件的常规操作[项目/场景创建、保存等,还有打包项目]

■ 编辑 Edit:复制、剪切、粘贴等操作

■ 资源 Assets:创建[脚本、场景、动画等等]、导入导出等等

■ 游戏对象 GameObject:会在游戏场景中真正显示出来

■ 组件 Component:非常重要,因为unity是面向组件的
- 组件和游戏对象是不可分隔的关系,一个游戏对象身上可以挂多个组件

■ 2d 和 3d 场景的切换:

- 点一下2D,就变成了3D场景

(5) unity 项目的运行,是运行的是整个场景,而非单个的游戏对象
- 运行的单位是场景!

4、对游戏对象的常见操作
(0) transform 属性相关的操作的工具栏

(1) 拉伸

- 重置为000

(2) 隐藏或显示图层中的游戏对象

(3) 看到游戏对象的网格形状

- 为了方便观察,一般选择 Shaded Wireframe

(4) 选择游戏对象:直接鼠标点击一下即可
(5) 右键-眼睛环绕

(6) 手的模式下,结合鼠标滚轮,可以进行拖拽,调远调近观察
进入手的模式,快捷方式,直接按住鼠标滚轮
和右键-眼睛环绕一样,都是为了更好地全面观察游戏对象

(7) 父子游戏对象,父游戏对象的坐标改变会一起改变子游戏对象的坐标
- 一个游戏对象,创建后的默认坐标位置 position,默认是相对于世界坐标的位置,简称为世界坐标位置
- 如果一个游戏对象,变成了另外一个游戏对象的子游戏对象,那么它的坐标就是相对位置-【相对于父游戏对象的位置】,简称相对位置

- 最外层的游戏对象

- 对于父子游戏对象的坐标轴位置,父坐标轴位置默认在父子游戏对象的中间:

- 可以设置一下为轴心,父坐标位置即可回到父游戏对象身上

- 坐标轴,全局是针对世界坐标

(8) unity 打包操作
在unity 中将图片、模型文件[后缀是.fbx]等素材进行打包
打包完的文件类型是 Unity package file
(9) 标签和图层
- 标签:一般是咱自己用于在代码中,判断游戏对象是否是咱想要的游戏对象
- 图层:是unity做的一种归类划分,归类之后,可以给摄像机等做过滤显示;比如摄像机对于这个图层的是不显示的,还有对于碰撞,这个图层可以不去碰撞等等。
5、组件
(1) 什么是组件
组件就是功能,需要给游戏对象添加什么功能就只需给它添加上组件。
在Unity中,游戏物体是不具备任何功能的,如果想要为其添加功能,那么就需要为它添加该功能的组件,而每一个组件其实就是一个引擎内部的组件脚本或是由自己编写的组件脚本 。也就是说,一个游戏物体(GameObject)会包含多个组件(Component),每一个组件又是一个组件脚本。
- 比如:给游戏对象添加上重力组件,该游戏对象就会往下掉。
- 又比如:transform 也是一个组件。
- 又比如:灯光之所以是灯光,那是因为它比别人多了一个灯光的组件。游戏对象其实都是默认自带了一些组件,比如立方体自带上了立方体的组件,球自带上了球的组件。
- 一个游戏对象(图层外层)对应一个脚本,当需要的功能[组件]不存在的时候,需要自己手动编写脚本!
(2) 手动编写C#脚本
- 在项目中手动添加上C#脚本

- 添加上脚本

每个游戏对象之所以表现形式不同,是因为绑定到他们身上的组件脚本不同!
(3) 组件的生命周期
- 从 Awake 到 OnDestroy:
- Awake 之后就是激活OnEnale,然后是开始Start
- 改变:按帧改变Update-LateUpdate,按固定时间频率改变FixedUpdate
- 取消激活OnDisable:和激活OnEnable是一对
- 最后如果删除了组件,则会执行销毁OnDestroy

激活OnEnale和取消激活OnDisable:

■ 脚本的生命周期的执行顺序
如果有多个脚本,test1.cs、test2.cs、test3.cs
脚本的执行顺序是:会想把test1.cs、test2.cs、test3.cs 的所有Awake方法执行完[如果有手动写Awake方法的情况!],接着是从test1.cs到test2.cs最后到test3.cs 执行下一个生命周期-激活OnEanale[如果有手动写OnEanale方法的情况!],然后又是从从test1.cs到test2.cs最后到test3.cs 执行下一个生命周期Start......
▷ 现阶段的生命周期从Awake开始,每次都是从项目中第一个脚本到最后一个脚本,执行。
▷ 接着进入下一个生命周期,所有的脚本也是从项目中第一个脚本到最后一个脚本,执行当前的生命周期!
如果想要更改项目中脚本之间的生命周期的执行顺序,可以在编辑->项目设置->脚本执行顺序设置一下
- 顺序添加错了,直接拖拽更改即可

6、预制体和变体
(1) 什么事预制体
其实,就是把场景中做好的东西[独立的游戏对象]封装成预制体[生成一个文件]。
- 预制体的后缀是 .prefab

(2) 预制体好处:

(3) 预制体和场景的游戏对象的区别:
① 直接修改预制体,则场景中的游戏对象会同步发生改变。但是如果只直接修改了场景中的游戏对象,预制体不变。
- 包括了直接在预制体身上挂着组件,场景中的游戏对象会同步挂载。
② 想要实现修改场景中的游戏对象,预制体同步发生改变:
- 选择“打开”模式

③ 场景中的游戏对象,挂载了组件,想要同步挂载到预制体身上:
- 单个挂载:

- 批量挂载:override批量应用到预制体

(4) 通过场景中的游戏对象,快速选中预制体

(5) 变体
预制件变体:对当前的游戏对象,生成一个变体,变体会依赖旧的预制体。
当旧的预制体发生改变,变体也会跟着一起改变。但是变体改变,预制体不会发生改变。

7、动态修改游戏对象的属性
(1) 游戏对象和所挂载的C#脚本之间的关系:

(2) C#脚本的类中添加了一个属性对象,将该属性对象和Unity的游戏对象进行关联


(3) 通过预制体,在场景中实例化出游戏对象

- 结果1:

- 结果2:

■ EmptyTest.cs 内容如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/**
* EmptyTest 类是绑定在场景SamepleScene下的游戏对象Empty身上
* 补充,课外小知识,C#的 Debug.Log 方法,其实就是相当于 前端项目的 console.log 方法,也就是开发过程中用于打印日志的
*/
public class EmptyTest : MonoBehaviour
{
public GameObject Cube;
//预制体
public GameObject Prefab;
// Start is called before the first frame update
void Start()
{
//当前类的属性gameObejct就对应了unity当前脚本所绑定的游戏对象
GameObject gameObject = this.gameObject;
Debug.Log("gameObject: " + gameObject);
Debug.Log("gameObject的名称:" + gameObject.name);
Debug.Log("gameObject的标签:" + gameObject.tag);
Debug.Log("gameObject的图层:" + gameObject.layer);
Debug.Log("Empty下的Cude的name:" + Cube.name);//子物体的名称
Debug.Log("Empty下的Cude的继承的父类的激活状态:" + Cube.activeInHierarchy);//子物体继承关系的激活状态【看所继承的父物体的激活状态】
Debug.Log("Empty下的Cude的自身的激活状态:" + Cube.activeSelf);//子物体自身的激活状态
Debug.Log("Empty的transform:" + transform.position);//位置
Debug.Log("Empty下的Cude的transform:" + transform.Find(Cube.name).position);//位置
//给游戏对象添加上组件,通过拿到游戏对象.AddComponent方法
gameObject.AddComponent<MeshFilter>();
Cube.AddComponent<AudioSource>();
//获取其他组件【这个其他组件,其实就是排除掉Transform这个必须的组件后的其他组件】
Debug.Log("Empty获取其他组件:" + GetComponent<BoxCollider>());
Debug.Log("Cube获取其他组件:" + Cube.GetComponent<BoxCollider>());
//从子物体身上获取组件
// GetComponentInChildren<BoxCollider>();
//从父物体身上获取组件
//GetComponentInParent<BoxCollider>();
//全局查找--细节,就是首字母大写了,小写的是属性
//所谓的全局查找,其实就是对当前的C#脚本所处的场景SamepleScene下进行全局查找
GameObject testGameObject = GameObject.Find("TestGameObject");
//还可以通过标签名获取到游戏对象
GameObject testGameObejct2 = GameObject.FindWithTag("enemy");
Debug.Log("testGameObject:" + testGameObject);
Debug.Log("testGameObject2:" + testGameObejct2);
//还可以设置游戏对象是否激活
testGameObject.SetActive(false);//取消激活
//需求:通过预制体,在场景中实例化出游戏对象
//预制体的类型也是GameObject
// Instantiate(Prefab);
// 实例化出游戏对象,并且是当前挂载了C#脚本的游戏对象的子物体
GameObject capsule = Instantiate(Prefab, transform);
// 销毁游戏对象
Destroy(capsule);
}
// Update is called once per frame
void Update()
{
}
}
8、Application 读写文件需要用到的类
(1) Application 读写文件

(2) Application 还有控制权限的作用,比如控制游戏后台运行,打开链接,退出游戏

9、游戏场景
■ 核心类-场景管理类 SceneManager:和场景的创建、场景切换|加载、场景的获取、场景数量、场景卸载有关

■ 关于场景的常用属性:场景名称、场景是否已加载、场景路径、场景索引、场景中独立的游戏对象

■ 异步加载场景并获取进度
- 通过协程的方式[协程,其实就是协助类型的多线程] StartCoroutine(任务);
- 在Update中获取到进度,因为Update是输出每一帧的改变

▷ 通过计时器控制场景跳转:

10、transform
(1) 位置、旋转、缩放、向量

(2) transform 其他关系

(2) transform 父子关系
游戏对象的父子级关系,其实是通过transform 维持的

......
11、Unity GUI(简称UGUI)
GUI:Graphical User Interface 图形用户界面或图形用户接口。
GUI,是平面的,在2d下操作

- UI 常用的控件

UI 最基本的是
画布Canvas,相当于屏幕。- 最基本的UI就是画布Canvas,其他UI控件-Text、Image、Button等等都是放在画布上面的,作为Canvas的子控件。
UI 另外最基本的是
事件系统EventSystem,其实就是把很多常见的事件,比如点击事件,封装起来。
(1) Canvas,相当于屏幕
■ Canvas组件的渲染模式一般默认是屏幕空间-覆盖
- 摄像机是拍摄到真正的游戏画面,3d画面。摄像机拍摄到画面会先被渲染出来。
- UI 覆盖:会覆盖到摄像机拍摄的画面之上。所以,UI 永远可以在最上层显示。
- 这也符合大多数真实的游戏情况,UI 显示在游戏画面之上。比如,打开一个背包界面或者人物属性界面,不可能被游戏场景的物体,比如被树木遮盖住。

■ Canvas组件的缩放模式一般是选择按屏幕分辨率缩放
- Canvas 做了适配,要真正生效,Canvas 下的第一层子控件也是要做适配。

第一层的子控件做适配:
锚点是设置在父物体身上的。
控件锚点的作用:控件永远会和锚点保持一定的距离。

(2) 事件绑定:以Button这个UI为例
① 在画布Canvas 下添加UI-Button,在项目下创建一个C#脚本,然后把C#脚本挂载到Button身上
② 接着在C# 方法,写一个点击事件发生时的处理方法 BtnClick()
③ 最后在Button 组件下面的On Click() 添加上C# 脚本中,点击事件发生时的处理方法 BtnClick()



(3) 管理UI 组件-面板Panel[布局、对齐、适配的轴点位置等]
(4) 关于GUI常见的UI【text、button、slider等等】 的一些操作详情,可以参考文章:
- 写得非常详细---《unity之UGUI系统基础》:https://blog.csdn.net/qq_42898629/article/details/83504863
如果本文对你有帮助的话记得给一乐点个赞哦,感谢!
Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】的更多相关文章
- Unity3d入门 - 关于unity工具的熟悉
上周由于工作内容较多,花在unity上学习的时间不多,但总归还是学习了一些东西,内容如下: .1 根据相关的教程在mac上安装了unity. .2 学习了unity的主要的工具分布和对应工具的相关的功 ...
- C#开发Unity游戏教程之Scene视图与脚本的使用
C#开发Unity游戏教程之Scene视图与脚本的使用 Unity中Scene视图的快捷操作 Scene视图是开发者开发游戏时,操作最频繁的视图.因为一旦一个游戏对象被添加到游戏的场景中,就需要首先使 ...
- Unity 2D游戏开发教程之使用脚本实现游戏逻辑
Unity 2D游戏开发教程之使用脚本实现游戏逻辑 使用脚本实现游戏逻辑 通过上一节的操作,我们不仅创建了精灵的动画,还设置了动画的过渡条件,最终使得精灵得以按照我们的意愿,进入我们所指定的动画状态. ...
- Unity编程标准导引-Unity中的基本概念-2.1界面概览
Unity中的基本概念 本文我们介绍Unity中的基本概念,包括:场景.游戏对象.组件.预制件.资源等. 2.1.界面概览 打开Unity之后,我们大概可以看到以上画面,以上画面中即显示了我们最常用到 ...
- Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作
刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下 废话不多说 先上效果图 获取定位并根据手机朝向显示周边信息 使用的Unity ...
- C#开发Unity游戏教程之Unity中方法的参数
C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号“( )”,有意义吗?看起来最多也就是起个快速识别 ...
- [Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)
[Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this ap ...
- unity中调试模型时unity崩溃问题
这个问题是在我调试3D模型资源时出现的,每当在Scene场景中调试模型时unity崩溃,出现Unity Bug Reporter页面,反复出现这个问题,很烧脑 对于这个问题我表示很无语,但是经过不断查 ...
- [IoC容器Unity]第一回:Unity预览
1.引言 高内聚,低耦合成为一个OO架构设计的一个参考标准.高内聚是一个模块或者一个类中成员跟这个模块或者类的关系尽量高,低耦合是不同模块或者不同类之间关系尽量简单. 拿咱国家举例来说,假如你是中国人 ...
- 扩展Unity3D编辑器的脚本模板
近期在学习Shader时感觉Shader语言參数众多.语法诡异,假设每次都从头開始写Shader一定是一件痛苦的事情.假设能够在本地定义好一组标准的Shader模板,这样当我们须要实现某些效果相似 ...
随机推荐
- cmake 实现交叉编译注意事项
(1)确保安装交叉编译工具安装成功 在终端输入arm-linux-gnueabihf-g++ -v 或 arm-linux-gnueabihf-gcc -v ,能看到相应交叉C编译器和C++编译器的版 ...
- 正确理解RestFul 接口
一.REST# REST,即Representational State Transfer的缩写,翻译过来就是"表现层状态转化".不得不承认,我在刚开始看到这个名词的时候是一脸懵逼 ...
- List,Set,Map存取元素各有什么特点 hashMap、hashTable的区别 Arraylist和linkedList的区别
1.List,Set,Map存取元素各有什么特点? 1.存放 (1)List存放元素是有序,可重复 (2)Set存放元素无序,不可重复 (3)Map元素键值对形式存放,键无序不可重复,值可重复 2.取 ...
- KMP算法学习记录
Foreword: 初学KMP匹配算法,不得其门,总感觉自己想,想不出来,看书上文字解释晦涩难懂.不能准确的捕捉算法设计时候的灵光和思路 .于是自己试着完成了一遍,现将过程记录下来,以供复习. Con ...
- python3安装turtle失败问题
失败截图: 解决办法: 1.下载turtle-0.0.2 2.解压文件夹到指定目录 3.打开setup.py找到第四十行修改 4.打开cmd进入turtle-0.0.2所在文件夹的上一层文件夹,执行p ...
- 双调排序--GPU/AIPU适合的排序【转载】
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入 双调排序是data-indepen ...
- ABP vNext微服务架构详细教程——镜像推送
1. Jenkins搭建 为实现容器化部署,我们需要将代码打包成镜像并推送至容器仓库,我们可以选择自建容器仓库或者使用公有云服务商提供的镜像仓库.这里我们使用阿里云提供的免费镜像仓库. 代码打包和镜像 ...
- Do whlie 循环
Do whlie 循环 ◆对于while语句而言,如果不满足条件,则不能进入循环.但有时候我们需要即使不满足条件,也至少执行-次. ◆do...while循环和while循环相似,不同的是,do... ...
- pymysql安装后使用报错处理
1.django启动报错: Error loading MySQLdb module. Did you install mysqlclient? 原因:初次安装配置pymysql时需要在__init_ ...
- MybatisPlus 实现多表联合分页条件查询
方式一:XML 有点繁琐,不太想用 mapper接口 public interface RoomMapper extends BaseMapper<Room> { List<Room ...