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

news2024/10/4 15:31:48

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




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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】1. 命名空间

文章目录一、命名空间的由来二、命名空间的使用2.1 关键字&#xff1a;namespace2.2 访问命名空间里的标识符2.3 命名空间的特点三、总结一、命名空间的由来 当我们使用c语言编写项目时&#xff0c;可能遇到以下情况&#xff1a; 变量名与某个库函数名重复&#xff0c;导致保…

sscanf和snprintf格式化时间字符串的日期与时间戳相互转换用法

sscanf格式化时间字符串的用法 UTC&#xff1a;Coordinated Universal Time 协调世界时。因为地球自转越来越慢&#xff0c;每年都会比前一年多出零点几秒&#xff0c;每隔几年协调世界时组织都会给世界时1秒&#xff0c;让基于原子钟的世界时和基于天文学&#xff08;人类感知…

测试技术与信号处理实验报告

目录 金属箔式应变片——单臂电桥性能实验 金属箔式应变片——半桥性能实验 金属箔式应变片——全桥性能实验 差动变压器的性能实验 直流全桥的应用——电子秤实验 交流激励时霍尔式传感器的位移特性实验 电容式传感器的位移实验 磁电式转速传感器测速实验 金属箔式应变…

C++ -- 继承

文章目录1. 继承的概念和定义1.1 概念1.2 定义1.2.1 定义格式1.2.2 继承基类成员访问方式的变化2. 基类和派生类对象赋值转换3. 继承中的作用域4. 派生类的默认成员函数5. 继承与友元6. 继承与静态成员7. 复杂的菱形继承及菱形虚拟继承8. 继承和组合1. 继承的概念和定义 1.1 概…

听歌无线耳机哪个品牌好?2023适合听歌的好音质蓝牙耳机推荐

现如今&#xff0c;不管是听歌、追剧或是玩游戏&#xff0c;不少人喜欢戴蓝牙耳机进行。因为蓝牙耳机的功能更丰富&#xff0c;连接方便&#xff0c;还摆脱了线的束缚&#xff0c;使用起来更方便。那么&#xff0c;听歌无线耳机哪个品牌好&#xff1f;针对这个问题&#xff0c;…

『造轮子』亿级短URL生成器的架构设计及源码分享

&#x1f4e3;读完这篇文章里你能收获到 了解博主的短链生成的架构设计思路学习不同的短链技术方案选择学习基于混淆的自增短URL算法了解博主造的轮子SuperShortLink短链开源项目感谢点赞收藏&#xff0c;避免下次找不到~ 文章目录一、需求分析1. 短链生成及访问需求2. 短链应…

Python+requests+unittest+excel接口自动化测试框架

一、框架结构&#xff1a; 工程目录 二、Case文件设计 三、基础包 base 3.1 封装get/post请求&#xff08;runmethon.py&#xff09; 1 import requests2 import json3 class RunMethod:4 def post_main(self,url,data,headerNone):5 res None6 if heade…

互联网医院源码|搭建互联网医院系统时运营需要哪些资质?

目前一线城市已经都有完善的医疗系统&#xff0c;人们对于线上问诊系统越来越熟悉&#xff0c;使用的人也越来越多&#xff0c;对于一些偏远的地区来说在线问诊平台有着更广泛的应用和意义&#xff0c;互联网医院开发实现了医疗资源共享的情况&#xff0c;打破了地域限制&#…

文献管理软件Endnote、Mendeley、Zotero比较及选择,Zotero基础使用技巧

引言 大家好&#xff0c;我是比特桃。日常开发的项目分为两种&#xff0c;一种是成熟化的工程项目&#xff0c;只需要与具体的业务紧密结合及应用&#xff0c;难点也比较偏向于软件工程或者互联网高并发的方向。这种项目我们通常不会选择去查文献去寻找问题的解决办法&#xf…

微信小程序开发 | 音乐小程序项目

音乐小程序项目3.1 开发前的准备3.1.1 项目展示3.1.2 项目分析3.1.3 项目初始化3.2 【任务1】标签页切换3.2.1 任务分析3.2.2 前导知识3.2.3 编写页面结构和样式3.2.4 实现标签页切换3.3 【任务2】音乐推荐3.3.1 任务分析3.3.2 前导知识3.3.3 内容区域滚动3.3.4 轮播图3.3.5 功…

15-721 chapter2 内存数据库

Background 随着时代的发展&#xff0c;DRAM可以容纳足够的便宜&#xff0c;容量也变大了。对于数据库来说&#xff0c;数据完全可以fit in memory&#xff0c;但同时面向disk的数据库架构不能很好的发挥这个特性 这张图是disk database的cpu instruction cost 想buffer pool…

使用PyG(PyTorch Geometric)实现基于图卷积神经网络(GCN)的节点分类任务

文章目录基本介绍PyTorch Geometric图卷积神经网络GCN节点分类任务实现Cora数据集搭建GCN模型训练与测试迭代并输出完整代码基本介绍 PyTorch Geometric PyG&#xff08;PyTorch Geometric&#xff09;是一个基于PyTorch的库&#xff0c;可以轻松编写和训练图神经网络&#x…

ChatGPT,开启人机交互新篇章

ChatGPT在世界掀起了生成式AI的热潮&#xff0c;2个月实现月活用户过亿&#xff0c;是人类有史以来突破1亿人用户最快的消费端互联网产品&#xff0c;打破了Tiktok9个月破亿用户的纪录。不少专家将其视为第四次工业革命&#xff0c;资本市场也贡献大量涨停。当第一波的热情消退…

Android 7.1 Toast修复之终极篇,进程不奔溃(包含apk和兼容外来dex插件)

修复android 7.1 Toast的篇章&#xff1a; 常规app通过ams lancet 字节编码处理&#xff1a;Android Lancet Aop 字节编码修复7.1系统Toast问题(WindowManager$BadTokenException)多渠道游戏app兼容性处理:Android 7.1 Toast修复之多渠道包动态使用Booster或者Lancet plugin …

在外web浏览器远程访问jupyter notebook服务器【内网穿透】

文章目录前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口转载自远控源码文章&#xff1a;公网远程访问jupyter notebook【cpolar内网穿透】 前言 Jupyter Notebook&#xff0c;它是一个交…

未来城市的微小单元:滴滴即将量产无人车

汽车诞生之后就一直作为除了家庭与公司之外的「第三空间」存在&#xff0c;技术的脚步从未停止过开发汽车的更多可能。尤其无人驾驶技术的出现&#xff0c;进一步解放了驾驶者&#xff0c;也让人们对于这一能够自主移动的第三空间充满了想象。作为未来城市的微小组成单元&#…

( “树” 之 DFS) 226. 翻转二叉树 ——【Leetcode每日一题】

226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[…

ThreadLocal源码分析及内存泄漏

ThreadLocal原理分析及内存泄漏ThreadLocal的使用ThreadLocal原理set方法解析replaceStaleEntry方法解析expungeStaleEntry方法解析cleanSomeSlots方法解析case 1: 向前有脏数据&#xff0c;向后找到可覆盖的Entrycase 2: 向前有脏数据&#xff0c;向后未找到可覆盖的Entrycase…

吴恩达机器学习--线性回归

文章目录前言一、单变量线性回归1.导入必要的库2.读取数据3.绘制散点图4.划分数据5.定义模型函数6.定义损失函数7.求权重向量w7.1 梯度下降函数7.2 最小二乘法8.训练模型9.绘制预测曲线10.试试正则化11.绘制预测曲线12.试试sklearn库二、多变量线性回归1.导入库2.读取数据3.划分…

掌握高效绘制地图的利器——LeafletJs

文章目录前言一、leafletJs是什么&#xff1f;二、快速入门1、安装2、快速入门三、进阶学习1、Map 控件2、Marker 标记3、Popup 弹出窗口4、图层四、项目实战封装文件4.1 基础点位图4.2 行驶轨迹图前言 GIS 作为获取、存储、分析和管理地理空间数据的重要工具&#xff0c;用 G…