Unity学习参考文档和开发工具

☺ unity的官网文档:脚本 - Unity 手册

■ 学习方式:

首先了解unity相关概述,快速认识unity编辑器,然后抓住重点的学:游戏对象、组件|C#脚本、预制体、UI

☺ 学习过程你会发现,其实Unity中主要是用c#进行开发。

因为在这个过程中,无非就是,对游戏对象通过挂载的C#脚本,修改一下组件的一些属性,控制一下激活之类的操作。到了UGUI,同样,也是通过挂载的C#脚本,监听到事件发生后,调用一下C#脚本定义的方法处理一下事件。

  • unity快速上手文档:Setting up 3D Beginner - Unity Learn
  • 视频[这种动手类的快速上手,建议跟着视频动手操作一番]:【Unity教程】零基础带你从小白到超神_哔哩哔哩_bilibili
  • ★重点学习内容:游戏对象、组件|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 内容如下: 

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-c language-c#">using System.Collections;
using System.Collections.Generic;
using UnityEngine;

<span style="color:#008000">/**
 * EmptyTest 类是绑定在场景SamepleScene下的游戏对象Empty身上
 * 补充,课外小知识,C#的 Debug.Log 方法,其实就是相当于 前端项目的 console.log 方法,也就是开发过程中用于打印日志的
 */</span>
public <span style="color:#0000ff">class</span> <span style="color:#a31515">EmptyTest</span> : MonoBehaviour
{
    public GameObject Cube;
    <span style="color:#008000">//预制体</span>
    public GameObject Prefab;


    <span style="color:#008000">// Start is called before the first frame update</span>
    <span style="color:#a31515">void</span> <span style="color:#a31515">Start</span>()
    {
        <span style="color:#008000">//当前类的属性gameObejct就对应了unity当前脚本所绑定的游戏对象</span>
        GameObject gameObject = this.gameObject;
        Debug.Log(<span style="color:#a31515">"gameObject: "</span> + gameObject);
        Debug.Log(<span style="color:#a31515">"gameObject的名称:"</span> + gameObject.name);
        Debug.Log(<span style="color:#a31515">"gameObject的标签:"</span> + gameObject.tag);
        Debug.Log(<span style="color:#a31515">"gameObject的图层:"</span> + gameObject.layer);
        Debug.Log(<span style="color:#a31515">"Empty下的Cude的name:"</span> + Cube.name);<span style="color:#008000">//子物体的名称</span>
        Debug.Log(<span style="color:#a31515">"Empty下的Cude的继承的父类的激活状态:"</span> + Cube.activeInHierarchy);<span style="color:#008000">//子物体继承关系的激活状态【看所继承的父物体的激活状态】</span>
        Debug.Log(<span style="color:#a31515">"Empty下的Cude的自身的激活状态:"</span> + Cube.activeSelf);<span style="color:#008000">//子物体自身的激活状态</span>
        Debug.Log(<span style="color:#a31515">"Empty的transform:"</span> + transform.position);<span style="color:#008000">//位置</span>
        Debug.Log(<span style="color:#a31515">"Empty下的Cude的transform:"</span> + transform.Find(Cube.name).position);<span style="color:#008000">//位置</span>
        <span style="color:#008000">//给游戏对象添加上组件,通过拿到游戏对象.AddComponent方法</span>
        gameObject.AddComponent<MeshFilter>();
        Cube.AddComponent<AudioSource>();
        <span style="color:#008000">//获取其他组件【这个其他组件,其实就是排除掉Transform这个必须的组件后的其他组件】</span>
        Debug.Log(<span style="color:#a31515">"Empty获取其他组件:"</span> + GetComponent<BoxCollider>());
        Debug.Log(<span style="color:#a31515">"Cube获取其他组件:"</span> + Cube.GetComponent<BoxCollider>());
        <span style="color:#008000">//从子物体身上获取组件</span>
        <span style="color:#008000">// GetComponentInChildren<BoxCollider>();</span>
        <span style="color:#008000">//从父物体身上获取组件</span>
        <span style="color:#008000">//GetComponentInParent<BoxCollider>();</span>

        <span style="color:#008000">//全局查找--细节,就是首字母大写了,小写的是属性</span>
        <span style="color:#008000">//所谓的全局查找,其实就是对当前的C#脚本所处的场景SamepleScene下进行全局查找 </span>
        GameObject testGameObject = GameObject.Find(<span style="color:#a31515">"TestGameObject"</span>);
        <span style="color:#008000">//还可以通过标签名获取到游戏对象</span>
        GameObject testGameObejct2 = GameObject.FindWithTag(<span style="color:#a31515">"enemy"</span>);
        Debug.Log(<span style="color:#a31515">"testGameObject:"</span> + testGameObject);
        Debug.Log(<span style="color:#a31515">"testGameObject2:"</span> + testGameObejct2);
        <span style="color:#008000">//还可以设置游戏对象是否激活</span>
        testGameObject.SetActive(<span style="color:#a31515">false</span>);<span style="color:#008000">//取消激活</span>

        <span style="color:#008000">//需求:通过预制体,在场景中实例化出游戏对象</span>
        <span style="color:#008000">//预制体的类型也是GameObject</span>
        <span style="color:#008000">// Instantiate(Prefab);</span>
        <span style="color:#008000">// 实例化出游戏对象,并且是当前挂载了C#脚本的游戏对象的子物体</span>
        GameObject capsule = Instantiate(Prefab, transform);
        <span style="color:#008000">// 销毁游戏对象</span>
        Destroy(capsule);
    }

    <span style="color:#008000">// Update is called once per frame</span>
    <span style="color:#a31515">void</span> <span style="color:#a31515">Update</span>()
    {
        
    }
}
</code></span></span>

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[布局、对齐、适配的轴点位置等]

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

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

相关文章

大麦订单生成器 大麦一键生成订单

后台一键生成链接&#xff0c;独立后台管理 教程&#xff1a;修改数据库config/Conn.php 不会可以看源码里有教程 下载源码程序&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章

今次介绍一个应用程序单例唯一运行方案的代码。 我们知道&#xff0c;有些应用程序在操作系统中需要单例唯一运行&#xff0c;因为程序多开的话会对程序运行效果有影响&#xff0c;最基本的例子就是打印机&#xff0c;只能运行一个实例。这里将笔者单例运行的代码共享出来&…

安防监控视频融合EasyCVR平台接入RTSP流后设备显示离线是什么原因?

安防监控视频EasyCVR视频汇聚融合平台基于云边端智能协同架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台支持海量视频汇聚管理、全网分发、按需调阅、鉴权播放、智能分析等视频能力与服务。平台开放度高、兼容性强、可支持灵活拓展与第三方集成&#xff…

聊聊比亚迪的DM-i技术

比亚迪的DM-i技术是一种混合动力技术&#xff0c;结合了燃油发动机和电动技术&#xff0c;旨在提高汽车的燃油经济性和环境友好性。 DM-i技术的核心是搭载了一台高效的燃油发动机和一组电动机&#xff0c;通过电子控制系统实现两者的协同工作。在日常行驶中&#xff0c;汽车首先…

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取数…

vue3中的自定义指令用法

我们都知道vue2中自定义指令全局和局部是这样写的 局部&#xff1a; 全局&#xff1a; 可vue3写法发生改变&#xff0c;如下&#xff1a; 全局&#xff1a; 局部&#xff1a;

台式机/工控机通过网线共享笔记本电脑无线网络linux系统下 usb网卡的驱动安装

一、台式机/工控机通过网线共享笔记本电脑无线网络 1、 将台式机通过网线和笔记本连接。 2、 将笔记本的“本地连接”和“无线网络连接”的ipv4均设置为自动获取。 4.修改台式机的IP地址为如下&#xff08;对应笔记本信息&#xff09; IP地址为192.168.XXX.12 子网掩码为255.2…

JavaScript |(六)DOM事件 | 尚硅谷JavaScript基础实战

学习来源&#xff1a;尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 文章目录 &#x1f4da;事件对象&#x1f4da;事件的冒泡&#x1f4da;事件的委派&#x1f4da;事件的绑定&#x1f407;赋值绑定&#x1f407;addEventListener()&#x1f407;attachEvent()&…

javaAPI(五):System、Math、BigInteger、BigDecimal

System类 System类代表系统&#xff0c;系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。 由于该类的构造器是private的&#xff0c;所以无法创建该类的对象&#xff0c;也就是无法实例化该类。其内部的成员&#xff0c;所以也可以很方便的进行调用。变量…

Uni-Dock:GPU 分子对接使用教程

github文件下载&#xff1a; git clone https://github.com/dptech-corp/Uni-Dock.git cd Uni-Dock/example/screening_test wget https://github.com/dptech-corp/Uni-Dock/releases/download/1.0.0/unidock 将此文件加入到全局变量中 chmod x unidock sudo mv unidock /…

【数理知识】求刚体旋转矩阵和平移矩阵,已知 N>=3 个点在前后时刻的坐标,且这 N>=3 点间距离始终不变代表一个刚体

序号内容1【数理知识】自由度 degree of freedom 及自由度的计算方法2【数理知识】刚体 rigid body 及刚体的运动3【数理知识】刚体基本运动&#xff0c;平动&#xff0c;转动4【数理知识】向量数乘&#xff0c;内积&#xff0c;外积&#xff0c;matlab代码实现5【数理知识】协…

揭秘程序员最喜欢的5个高薪工作

大家好&#xff0c;这里是程序员晚枫。想了解更多精彩内容&#xff0c;快来关注程序员晚枫 今天给大家推荐5个适合程序员的高薪岗位。 01 推荐岗位 以下是5个工资最高的程序员工作&#xff1a; 数据科学家&#xff1a;数据科学家是负责数据收集、处理、分析和报告的专业人员。…

点击编辑变完成

<template><div><button click"dialogshowtrue">添加部门</button><div>部门列表</div><el-table ref"multipleTable" :data"form" tooltip-effect"dark" style"width: 100%">&l…

程序环境和预处理(含C语言程序的编译+链接)--1

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f43b;‍❄个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN…

【Python】数据分析+数据挖掘——掌握Python和Pandas中的单元格替换操作

1. 前言 数据处理和清洗是数据分析和机器学习中至关重要的步骤。在数据处理过程中&#xff0c;我们经常需要对数据集进行清洗和转换&#xff0c;其中单元格替换是一个常用的技术。Python作为一种功能强大且灵活的编程语言&#xff0c;为数据处理提供了丰富的工具和库。Pandas库…

tinkerCAD案例:31. 3D 基元形状简介

tinkerCAD案例&#xff1a;31. 3D 基元形状简介 1 将一个想法从头脑带到现实世界是一次令人兴奋的冒险。在 Tinkercad 中&#xff0c;这将从一个新的设计开始。 在新设计中&#xff0c;简单的原始形状可以通过不同的方式组合成更复杂的形状。 在这个项目中&#xff0c;你将探索…

网络安全设备及部署

什么是等保定级&#xff1f; 之前了解了下等保定级&#xff0c;接下里做更加深入的探讨 文章目录 一、网路安全大事件1.1 震网病毒1.2 海康威视弱口令1.3 物联网Mirai病毒1.4 专网 黑天安 事件1.5 乌克兰停电1.6 委内瑞拉电网1.7 棱镜门事件1.8 熊猫烧香 二、法律法规解读三、安…

C语言基础知识点一

C语言基础知识点一&#xff1a; 1.数据类型 2.bool类型&#xff1a; 使用bool时时&#xff0c;需要增加<stdbool.h>头文件。 说明&#xff1a;bool 类型只有非零&#xff08;true&#xff09;和零&#xff08;false&#xff09;两种值。 如: if&#xff08;-1&#xf…

【供电并接电路】2021-12-31

缘由在实际应用中mos管的导通问题 - 电路设计论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛!MOS管实际应用中的开通问题-硬件开发-CSDN问答 设计的思想是&#xff0c;当CH_5.2V有5.2V电压时&#xff0c;Q7导通&#xff0c;Q6产生UGS​压差&#xff0c;从而使Q6导通&#xff0c…

SpringBoot+AOP+Redission实战分布式锁

文章目录 前言一、Redission是什么&#xff1f;二、使用场景三、代码实战1.项目结构2.类图3.maven依赖4.yml5.config6.annotation7.aop8.model9.service 四、单元测试总结 前言 在集群环境下非单体应用存在的问题&#xff1a;JVM锁只能控制本地资源的访问&#xff0c;无法控制…