Unity项目开发※
主讲人:唐寅权
学习目标:
- 掌握Unity3D进行游戏项目、虚拟现实项目、数字孪生项目的开发能力
- 了解企业开发习惯、规范变成习惯、跟企业无缝衔接
- 通过项目优化能力的培养,进行项目优化改进、提升项目性能
- 熟练掌握项目开发的整个流程以及各部门之间的配合
学习内容:
- C#相关内容学习以及对应的数据结构和算法
- Unity引擎各功能模块以及对应API
- 项目开发过程中常用的设计模式
- 项目开发资源管理和代码的组织方式
0x01 背景※
Unity为哪些行业带来了新的解决方案※
- 游戏开发:Unity可以用于创建2D和3D游戏,支持各种游戏类型,如动作游戏、射击游戏、角色扮演等
- 教育行业:开发交互式教育应用程序、模拟器、虚拟实验室等
- 医疗保健行业:医学培训模拟器、手术模拟器等
- 建筑和房地产行业:
- 汽车行业
- 航天航空行业
- 娱乐行业
- 广告和营销行业
Unity特点※
- 游戏开发:Unity可以用于创建2D和3D游戏,支持各种游戏类型,如动作游戏、射击游戏、角色扮演等
- 跨平台:移动端(Android、IOS) PC(Windows、MacOS、Linux)主机(PS、Xbox)虚拟现实VR、增强现实AR等
- 强大的编辑器:场景编辑、资源管理、物理引擎、动画编辑等功能
- 脚本支持:支持多种编程语言,如C#、JavaScript(现为UnityScript)等
- 生态系统:资源商店、文档、教程、社区支持等
安装Unity※
登入Unity中国区官网,下载Unity安装器UnityHub (Windows、MacOS、Linux)安装引擎
没有账号,需要注册个账号,有账号的直接登入,就会自动下载UnityHub
按照安装指引安装软件,Archlinux可以安装unityhub-cn
安装好UnityHub后,打开UnityHub,选择Installs标签页,安装官方最新release版本
可以选择LTS版本、最新版本、等,带c1后缀是中国版本
0x02 开始动手※
- 创建项目选择3D模板
- 更改Project Name
- 选择位置
- 创建
Unity3D 基本操作※
视图操作※
Scene窗口
快捷键 | 功能 |
Alt+鼠标左键 | 以物体为中心、围绕物体进行观察 |
F | 聚焦物体 |
Q | 视图工具,平移整个Scene视图 |
W | 移动工具,移动场景中所选的对象 |
E | 旋转工具。按任意角度旋转场景中的对象 |
R | 缩放工具,缩放场景中所选对象 |
T | 横切面工具沿着横切面缩放场景中所选对象 |
Z | 轴心工具,改变游戏对象轴心点 |
X | 坐标系变换工具,本地坐标和世界坐标间切换 |
Ctrl+Shift+F | 摄像机对齐到当前窗口 |
Unity使用左手坐标系,坐标单位为米
编程模式※
unity中的编程模式※
在Unity中,通常会将面向对象编程、面向组件编程和面向过程编程结合起来,以便充分利用各种编程范式的优势来开发游戏。下面是一些方法可以在Unity项目中结合这三种编程风格:
- 使用类和对象来组织游戏中的逻辑和数据,实现代码的重用性和可维护性。
- 定义游戏对象的属性和行为,如玩家、敌人、道具等。
- 使用继承、多态和封装等面向对象的概念来构建游戏系统的层级结构。
面向组件编程
- 利用Unity的组件化体系结构,将功能和行为分解为独立的组件并挂载到游戏对象上
- 通过组件之间的交互实现复杂的游戏逻辑,提高灵活性和可拓展性
- 编写组件类来定义特定功能,如碰撞检测、移动控制、动画播放等。
面向过程编程
- 在处理简单、线性的问题时,可以采用面向过程的方式来实现相关功能。
- 在编写一次性、独立的任务或功能时,可以使用面向过程编程风格。
- 可以结合使用函数来执行特定任务,保持代码清晰简洁。
通过结合这三种编程风格,开发者可以根据具体需求和场景选择合适的方式来编写代码,充分利用各种方法的优势。例如,可以使用面向对象编程来定义游戏对象及其行为,使用组件来实现复杂的功能模块,而在某些简单的功能实现上则可以使用面向过程的方法。这样可以使代码逻辑更清晰、易于维护,并提高开发效率。
规范※
0x03 C#基础※
流程控制※
运算符※
数组※
值类型和引用类型※
0x04 组件※
Transform (3D):控制物体在世界的位置、旋转和缩放。(必要组件)
Rect Transform (2D)
Mesh Filter:管理物体顶点结构
Mesh Renderer:渲染器,渲染物体
Collider:碰撞器
Rigidbody:刚体
新建C# Script 模板
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 装备类
/// </summary>
public class Equip
{
// 数据成员
int id;
string name;
float price;
// 函数成员
}
/// <summary>
/// 类的结构
/// 1 数据成员
/// 1.1 基本数据成员
/// 整数:byte、short、int、long
/// 小数:float、double
/// 字符:char
/// 布尔:bool
/// 1.2 复杂数据成员
/// 字符串:string
/// 结构体:struct
/// 枚举:enum
/// 类:class
/// 委托:deleget
/// 2 函数成员
/// </summary>
public class ClassName : MonoBehaviour
{
// 数据成员
uint level; // 等级
double money; // 钱
float hp; // 血量
bool isDead; // 是否死亡
string name; // 名字
// 函数成员
Equip equip; // 装备,默认为null
// Start is called before the first frame update
// 初始化函数,Play时只执行一次
void Start()
{
// 操作数据成员
// 定义数据,不初始化有默认值
// 低精度可以给高精度赋值,高精度不能给低精度赋值
// 高精度给低精度赋值使用强制类型转换,会丢失精度
level = 1;
hp = 100f;
money = 9999;
exp = 0.0;
idDead = false;
name = "刀"
equip = new Equip();
print("level:"+level);
}
// Update is called once per frame
// 每一帧执行一次
void Update()
{
}
}
0x05 获取对象/组件※
生命周期函数※