【Unity】3D功能开发入门系列(二)

news2024/11/15 4:20:12

Unity3D功能开发入门系列(二)

  • 一、资源
    • (一)资源文件
    • (二)场景文件
    • (三)资源包
    • (四)Unity 资源商店
    • (五)项目资源的导入
  • 二、父子关系
    • (一)轴心
    • (二)父子关系
    • (三)空物体
    • (四)Global 与 Local
    • (五)Pivot 与 Center
  • 三、组件
    • (一)组件
    • (二)添加删除组件
    • (三)AudioSource 组件
    • (四)Transform 组件
    • (五)摄像机
  • 四、脚本
    • (一)脚本
    • (二)当前物体
    • (三)物体的坐标
    • (四)播放模式
  • 五、帧更新
    • (一)帧更新
    • (二)移动物体

一、资源

(一)资源文件

1. Assets 目录下的文件,称为资源

常见类型:

  • 模型文件 Model(*.fbx
  • 图片文件 Texture(*.jpg / png / psd / tif
  • 音频文件 AudioClip(*.mp3 / wav / aiff
  • 脚本文件 Script(*.cs
  • 材质文件 * .mat ,场景文件 *.unity ……
    在这里插入图片描述

2. 目录式的资源管理,和 Windows 类似

几个操作:

  • 在文件夹窗口查看,Show In Explorer
    在这里插入图片描述

  • 添加、删除目录

  • 添加资源文件(直接拖拽到项目中),文件会被拷贝到项目中

  • 复制资源:选中资源,Ctrl + D

  • 缩略图比例调节、列表模式

3. Meta,描述文件
每一个资源文件 / 文件夹,都对一个 *.meta 描述文件
在这里插入图片描述

(二)场景文件

1. 场景文件 *.unity,记录了场景中的节点数据
包含:

  • 场景全局设置
  • 节点
  • 节点下的组件
  • 每个组件的参数值

2. 一个场景代表一个关卡,可以创建多个场景

几个操作:

  • 添加场景
    在这里插入图片描述

  • 打开场景:双击

  • 编辑场景,保存 Ctrl+S
    在这里插入图片描述

(三)资源包

1. 资源包 Unity Package,即对 Assets 下的资源打包

演示:

  • 选择一个资源文件,或者一个目录
  • 右键,Export Package
  • 生成 *.unitypackage 资源包
    在这里插入图片描述
    在这里插入图片描述

2. 导入资源包
直接把 *.unitypackage 拖到 Project 窗口,拖到其他窗口没反应

(四)Unity 资源商店

资源商店 Asset Store,https://assetstore.unity.com/
也可以在 Unity 打开,Windows | Asset Store

有一些免费或收费的资源,包含模型、材质纹理等

(五)项目资源的导入

  • 导入资源: *.unitypackage
  • 查看资源:模型 / 材质 / 脚本
  • 查看示例场景:
    有的资源包下有示例场景,一般叫 AF demo scene

二、父子关系

(一)轴心

1. 轴心 Pivot,指一个物体的操作基准点
演示:

  • 移动一个物体
  • 旋转一个物体
    在这里插入图片描述
    对于基本体来说,轴心点默认位于几何中心

2. 轴心 Pivot 可以在任意位置,不一定是在几何中心(Center)
注意,轴心的位置是在建模软件中指定

(二)父子关系

1. 父子级,指两个物体之间的关系
在 Hierarchy 窗口中,拖动物体 B 到物体 A 下,子物体会随着父物体一并移动,删除父物体时,子物体一并删除
在这里插入图片描述
在这里插入图片描述
2. 相对坐标:子物体的坐标,是相对于父物体的
移动父物体时,观察子物体的坐标,可以发现,不管这么移动、旋转父物体,子物体的坐标都不会有任何变化
在这里插入图片描述

(三)空物体

1. 空物体 EmptyObject,即空对象、空节点

演示:

  • 添加一个空物体
    在这里插入图片描述

  • 空物体不可见(没有网格)

  • 空物体没有坐标,可以移动
    在这里插入图片描述

2. 空物体很常见,其作用:

  • 用于节点的组织和管理(谁做父节点都不合适)
    轴心只能在建模软件修改,我们可以用空物体代替原先的轴心
    在这里插入图片描述

  • 用于标记一个位置

3. GameObject,其实是一个节点 / 容器
一般所谓的 “物体” ,即有形状的东西,对应的 Mesh

(四)Global 与 Local

1. Global,即世界坐标系(默认使用)

  • 以世界中心为轴
  • 6 个方向代表:上下 东西 南北(无法向前运动)
    在这里插入图片描述

2. Local,即本地坐标系

  • 以物体自身为轴
  • 6 个方向代表:上下 前后 左右
    在这里插入图片描述
  • y 轴称为 up,z 轴称为 forward,x 轴称为 right
  • 一般的,要求模型的正脸与 z 轴方向一致

(五)Pivot 与 Center

1. Pivot,轴心(默认使用)
2. Center,几何中心

一般来说,物体的轴心并不在几何中心处,我们更喜欢用 Pivot 模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


三、组件

(一)组件

组件 Component,代表一个功能

例如:

  • Light,光源
    在这里插入图片描述
    在这里插入图片描述
  • Mesh Filter,网格过滤器
  • Mesh Renderer,网格渲染器
    在这里插入图片描述

(二)添加删除组件

通过此操作,可让一个空节点,变成一个实实在在的物体。组件,代表一个功能,需要什么功能,就添加什么组件
在这里插入图片描述

(三)AudioSource 组件

AudioSource 组件,用于播放音乐 / 音效

  1. 添加一个音乐文件,*.mp3 / wav / aiff
  2. 创建一个物体
    Add Component,Audio | Audio Source
    将音乐拖到 AudioSourse.AudioClip 属性
    在 3D 窗口上方,选 Toggle Audio On
    在这里插入图片描述
    在这里插入图片描述

(四)Transform 组件

1. Transform,称为变换组件

物体的基本参数:

  • Position,位置(相对坐标,相对父物体而言,没有父物体就是世界坐标)
  • Rotation,旋转(欧拉角)
  • Scale,缩放

2. Transform 组件特点

  • 所以物体都有
  • 不能被删除
    在这里插入图片描述

(五)摄像机

1. 摄像机 Camera,负责拍摄游戏画面

演示:

  • 调整窗口布局,Scene / Game 并排显示
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 选中摄像机,观察镜头范围
  • 摄像机的 z 轴指向,即为拍摄方向
  • 拍到的画面,呈现在 Game 窗口中(Game 窗口中的画面,即为玩家最终所见画面
    在这里插入图片描述

2. 调整摄像机的角度,两种方法

  • 手工 移动、旋转 摄像机,对准目标
  • Align with View,与 3D 视图对齐
    先在 3D 视图里摆好角度,此为观察者视角;然后选中 Main Camera,执行 Align with ViewCtrl + Shift + F
    此时,摄像机视角与观察者视角完全相同
    在这里插入图片描述

四、脚本

(一)脚本

脚本 Script,用于驱动游戏逻辑(动态效果、添加用户交互的实现方式)

1. 添加一个脚本

  • 右键Create | C# Script
  • 文件名必须规范(规范命名:遵循Pascal命名法则,单词首字母大写,例如:MyFristScript),文件名即为类名(不能使用中文、标点符号、空格等)
    在这里插入图片描述

2. 双击在 VS 中打开脚本,检查类名与文件名是否一致
如果不一致,后面是没法使用的
在这里插入图片描述
在这里插入图片描述

3. 在 VS 中编辑代码
添加一行打印输出,其中,Debug 是 Unity API 中的一个工具类
在这里插入图片描述

4. CTRL + S ,保存代码 ,并闭 VS

5. 编译
编译过程是自动的。保存脚本,回到Unity时会自动重新编译

6. 挂载脚本
两种办法:

  • Add Component ,选 Scripts | Simple Logic
  • 或者,直接将脚本拖到 Inspector 窗口的最下方
    在这里插入图片描述

7. 运行游戏

  • 点 Play 按钮,运行游戏
  • 在 Console 窗口中,观察输出
    若 Console 窗口未显示,则 Window | General | Console 调出此窗口
  • 再次点 Play 按钮,停止游戏
    在这里插入图片描述

  • C# 文件名必须和类型一致,否则无法挂载反射机制),如果不一致,要修改类名,必须在 VS 中双击类名+右键 重命名
    在这里插入图片描述
  • 脚本必须挂载到物体上,才会被调用

(二)当前物体

1. 在 SimpleLogic.cs 中,获取当前物体

  • this当前脚本组件
  • this.gameObject当前物体
    this.gameObject.name,当前物体的名字
  • this.gameObject.transform,当前物体下的 Transform 组件(为了简化书写,也可以写作 this.transform,效果相同)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SimpleLogic : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("** 我的第一个脚本");

        GameObject obj = this.gameObject;
        string name = obj.name;
        Debug.Log("** 物体名字:" + name);

        Transform tr = obj.transform;
        Vector3 pos = tr.position; // 三维向量
        Debug.Log("物体的位置:" + pos.ToString("F3")); // 保留3位小数
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

在这里插入图片描述

2. API 中的大部分类型,来自于 UnityEngine

  • 基类 MonoBehaviour
  • 游戏物体 GamrObject
  • 变换组件 Transform
  • 三维向量 Vector3

(三)物体的坐标

1. 物体的坐标

  • transform.position世界坐标(相对于世界中心点
  • transform.localPosition本地坐标(相对于父物体

一般使用的是 localPosition,与 Inspector 中的值一致

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SimpleLogic : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("** 开始测试..");

        Vector3 pos1 = this.gameObject.transform.position; 
        Debug.Log("物体世界坐标:" + pos1.ToString("F3"));
        Vector3 pos2 = this.gameObject.transform.localPosition;
        Debug.Log("物体本地坐标:" + pos2.ToString("F3"));
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

在这里插入图片描述
2. 为了简化书写,以下两种写法等效
this.gameObject.transform.position、this.transform.position,其中,this.transform 指向的就是 this.gameObject.transform

3. Vector3 类型,即三维向量,含 x y z 三个分量(float)
设置物体的坐标:

this.transform.localPosition = new Vector3(1.5f, 0, 2.0f);
// 其中,float 型的数值,在书写时应以 f 结尾

(四)播放模式

  • Edit Mode编辑模式
  • Play Mode播放模式
    在播放模式下,实时显示场景中的物体和属性,游戏中的状态不可保存(You must exit play mode to save the scene!)

五、帧更新

(一)帧更新

Frame,一个游戏帧
FrameRate帧率 / 刷新率
FPSFrames Per Second),每秒更新多少帧
Update( ),称为帧更新,此方法会被游戏引擎定时调用,以更新游戏的状态

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SimpleLogic : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("** SimpleLogic : Start()");
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("** Update 帧更新 ..");
    }
}

在这里插入图片描述
1. 帧率观察

  • Time.time游戏时间(从游戏启动开始已经经过了多长时间)
  • Time.deltaTime距上次更新的 时间差
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SimpleLogic : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("** SimpleLogic : Start()");
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("** Update 帧更新 .. time =" + Time.time + " 时间差 =" + Time.deltaTime);
    }
}

在这里插入图片描述

显然,帧率是不固定的,Unity 会尽量较快的更新

2. Unity 不支持固定帧率,但可以设定一个近似帧率

// 在 Start() 中设置
Application.targetFrameRate = 60;

其中,指示 Unity 尽量以 FPS = 60 的帧率更新游戏

(二)移动物体

1. 在 Update( ) 中,移动物体的位置

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SimpleLogic : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("** SimpleLogic : Start()");
        // 设置一下帧率,让电脑不要太卡
        Application.targetFrameRate = 60; 
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("** Update 帧更新 .. time =" + Time.time + " 时间差 =" + Time.deltaTime);

        Vector3 pos = this.transform.localPosition;
        pos.x += 0.01f;
        this.transform.localPosition = pos;
    }
}

物体的运动并不是匀速的,每次运动 0.01 米,但时间间隔 deltaTime 不固定

2. 匀速运动
使用 deltaTime,可以实现让物体匀速运动

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SimpleLogic : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("** SimpleLogic : Start()");
        // 设置一下帧率,让电脑不要太卡
        Application.targetFrameRate = 60; 
    }

    // Update is called once per frame
    void Update()
    {
        Debug.Log("** Update 帧更新 .. time =" + Time.time + " 时间差 =" + Time.deltaTime);

        float speed = 3;
        float distance = speed * Time.deltaTime;
        Vector3 pos = this.transform.localPosition;
        pos.x += distance; //0.01f;
        this.transform.localPosition = pos;
    }
}

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

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

相关文章

【C语言篇】数据在内存中的存储(超详细)

文章目录 数据在内存中的存储二进制和进制转换基本概念进制转换十进制转二进制二进制转八进制和十六进制 整数在内存中的存储反码原码补码大小端字节序和字节序判断什么是大小端?为什么有大小端 浮点数在内存中的存储题目提出浮点数存的过程浮点数取的过程 题目解析…

Java语言程序设计——篇十一(2)

🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…

算法导论 总结索引 | 第五部分 第二十一章:用于不相交集合的数据结构

一些应用涉及 将n个不同的元素分成一组不相交的集合。寻找包含给定元素的唯一集合 和 合并两个集合 1、不相交集合的操作 1、一个不相交集合 数据结构 维持了 一个不相交动态集的集合 S {S_1, S_2,…, S_n}。用一个代表 来标识每个集合,它是这个集合的某个成员。…

IoTDB 入门教程 企业篇④——安全控制 | 白名单、审计日志、登录日志和操作日志

文章目录 一、前文二、白名单2.1 配置文件iotdb-common.properties2.2 配置文件white.list2.3 注意事项 三、审计日志3.1 Cli操作日志3.2 RESTful操作日志3.3 MQTT操作日志3.4 Java操作日志3.5 C#操作日志3.6 Python操作日志 四、参考 一、前文 IoTDB入门教程——导读 IoTDB企业…

C语言9~10 DAY(合集)

数组的概念 什么是数组 数组是相同类型,有序数据的集合。 数组的特征 数组中的数据被称为数组的元素,是同构的 数组中的元素存放在内存空间里 (char player_name[6]:申请在内存中开辟6块连续的基于char类型的变量空间) 衍生概念&#x…

力扣高频SQL 50题(基础版)第三十七题

文章目录 力扣高频SQL 50题(基础版)第三十七题176.第二高的薪水题目说明实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题(基础版)第三十七题 176.第二高的薪水 题目说明 Employee 表: ----------------- …

【传知代码】基于标签相关性的多标签学习(论文复现)

在当今信息爆炸的时代,数据中包含的标签信息对于理解和分析复杂问题至关重要。在诸如文本分类、图像识别和推荐系统等应用中,如何有效地利用标签相关性提升多标签学习的效果成为了研究的热点之一。基于标签相关性的多标签学习方法,通过挖掘不…

存储届的奥运竞技 | 400层3D NAND最快2025到来~

随着内存巨头之间的高带宽内存 (HBM) 竞争日益激烈,NAND 存储器领域的竞争也在升温。据韩国媒体《etnews》报道,SK 海力士正在研发 400 层 NAND 闪存技术,计划在 2025 年底前准备好这项技术以实现量产。 报道称,SK 海力士目前正在…

AcWing并查集

建议先看这个 Bilibili------------------>图论——并查集(详细版) 其实M 1 2就是把1的祖先改成了2,然后M 3 4就是把3的祖先改成了4,然后查询这两数1,2的祖先是不是同一个,3,4的祖先是不是同一个,1,3的祖先是不是同…

【期货】收盘点评。昨天说的,p2409棕榈油在今天或者周一会走出行情

收盘点评 昨天说的,p2409棕榈油在今天或者周一会走出行情。事实就是如此。震荡了几天了,波幅不大的来回震荡,其实主力是不想震荡的,但是不震荡自己的货和行情走不出来。所以我昨天就说,应该就是这一两天会走出一波小行…

⑤【从0制作自己的ros导航小车:上、下位机通信篇】上、下位机串口DMA通信

从0制作自己的ros导航小车 前言一、准备工作二、下位机端(STM32)三、上位机端(旭日x3派)四、测试 系列文章: ①【从0制作自己的ros导航小车:介绍及准备】 ②【从0制作自己的ros导航小车:下位机篇…

一站式解决方案:打造无缝连接的跨渠道客户服务体验

在当今这个数字化时代,客户与企业之间的互动已不再局限于单一渠道。从社交媒体、在线聊天、电子邮件到电话热线,甚至是实体店面,客户期望能够随时随地、无缝切换地获得一致且高效的服务体验。因此,构建一站式解决方案,…

商城系统审计代码审计

1 开源组件通用性漏洞审计 1.1 fastjson漏洞审计与验证 1.1.1 相关知识 Fastjson是Alibaba开发的Java语言编写的高性能JSON库,用于将数据在JSON和Java对 象之间相互转换。 Fastjson反序列化漏洞简单来说是出现在将JSON数据反序列化过程中出现的漏洞。 攻击者可以传入一个恶…

算法小白的进阶之路(力扣6~8)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

对象属性值对比(支持复杂对象)

文章目录 前言一、如何对比二、开始编码三、使用结果示例总结 前言 需求如下: 对比两个bean中的内容,返回其中属性的值不一致的完整信息,包括: 属性 新值 旧值 一、如何对比 例如我有一个这的类型: public class Tel {private String name;private String tel; …

学习笔记第十七天

1.链表 1.1链表尾插 void push_back(struct Node *pHead,int n)//尾插 {if(isEmpty(pHead)){push_front(pHead,n);}else{struct Node *p pHead->next; while(p->next !NULL){p p->next;}struct Node *pNew malloc(sizeof(struct Node));p->nextpNew;pNew->n…

C++ bind复杂回调逻辑分析

回调函数基本知识回顾 回调函数是什么 函数指针或者函数对象作为参数传递给另一个函数的机制,当某个事件发生的时候,系统会自动的调用这些函数进行处理事件驱动模型中作用,回调函数则被用于处理I/O事件,通常用来读写异常等事件 bi…

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——2Yolo使用之ONNX模型准备 ​ 大家好,因为板端BPU环境,可以加速目标检测的速度,所以今天在此先给大家带来如何准备一个模型,下一期会给大家带来如何在板端部…

如何做一个惊艳领导和客户的原型?

在产品开发过程中,原型设计是验证设计想法、提升用户体验的重要环节。Axure作为一款业界领先的原型设计工具,凭借其强大的交互设计和丰富的功能,赢得了全球设计师和开发者的信赖。而Axure的高效交互元件库,则如同一本字典或说明书…

将YOLOv8模型从PyTorch的.pt格式转换为OpenVINO支持的IR格式

OpenVINO是Open Visual Inference & Neural Network Optimization工具包的缩写,是一个用于优化和部署AI推理模型的综合工具包。OpenVINO支持CPU、GPU和NPU设备。 OpenVINO的优势: (1).性能:OpenVINO利用英特尔CPU、集成和独立GPU以及FPGA的强大功能提…