发布时间:2023-04-21 文章分类:电脑百科 投稿人:赵颖 字号: 默认 | | 超大 打印

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

☺ unity的官网文档:https://docs.unity3d.com/cn/current/Manual/ScriptingSection.html

■ 学习方式:

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

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

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

■ 开发工具:

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编辑器

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(2) 项目设置

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(3) 全局设置

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(4) unity菜单栏介绍

■ 文件 File:文件的常规操作[项目/场景创建、保存等,还有打包项目]

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

■ 组件 Component:非常重要,因为unity是面向组件的

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

4、对游戏对象的常见操作

(0) transform 属性相关的操作的工具栏

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(1) 拉伸

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(4) 选择游戏对象:直接鼠标点击一下即可

(5) 右键-眼睛环绕

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(6) 手的模式下,结合鼠标滚轮,可以进行拖拽,调远调近观察

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(7) 父子游戏对象,父游戏对象的坐标改变会一起改变子游戏对象的坐标

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(8) unity 打包操作

(9) 标签和图层

5、组件

(1) 什么是组件

组件就是功能,需要给游戏对象添加什么功能就只需给它添加上组件。

在Unity中,游戏物体是不具备任何功能的,如果想要为其添加功能,那么就需要为它添加该功能的组件,而每一个组件其实就是一个引擎内部的组件脚本或是由自己编写的组件脚本 。也就是说,一个游戏物体(GameObject)会包含多个组件(Component),每一个组件又是一个组件脚本。

(2) 手动编写C#脚本

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

每个游戏对象之所以表现形式不同,是因为绑定到他们身上的组件脚本不同!

(3) 组件的生命周期

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

▪ 激活OnEnale和取消激活OnDisable:

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

■ 脚本的生命周期的执行顺序

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

6、预制体和变体

(1) 什么事预制体

其实,就是把场景中做好的东西[独立的游戏对象]封装成预制体[生成一个文件]。

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(2) 预制体好处:

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(3) 预制体和场景的游戏对象的区别:

① 直接修改预制体,则场景中的游戏对象会同步发生改变。但是如果只直接修改了场景中的游戏对象,预制体不变。

② 想要实现修改场景中的游戏对象,预制体同步发生改变:

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(5) 变体

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

7、动态修改游戏对象的属性

(1) 游戏对象和所挂载的C#脚本之间的关系:

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

■ 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 读写文件

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

9、游戏场景

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

■ 异步加载场景并获取进度

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

10、transform

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(2) transform 其他关系

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(2) transform 父子关系

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

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

11、Unity GUI(简称UGUI)

GUI:Graphical User Interface 图形用户界面或图形用户接口。

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(1) Canvas,相当于屏幕

■ Canvas组件的渲染模式一般默认是屏幕空间-覆盖

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

■ Canvas组件的缩放模式一般是选择按屏幕分辨率缩放

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(2) 事件绑定:以Button这个UI为例

① 在画布Canvas 下添加UI-Button,在项目下创建一个C#脚本,然后把C#脚本挂载到Button身上

② 接着在C# 方法,写一个点击事件发生时的处理方法 BtnClick()

③ 最后在Button 组件下面的On Click() 添加上C# 脚本中,点击事件发生时的处理方法 BtnClick()

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

Unity快手上手【熟悉unity编辑器,C#脚本控制组件一些属性之类的】

(3) 管理UI 组件-面板Panel[布局、对齐、适配的轴点位置等]

(4) 关于GUI常见的UI【text、button、slider等等】 的一些操作详情,可以参考文章:

如果本文对你有帮助的话记得给一乐点个赞哦,感谢!