【Unity】入门
文章目录
Unity已广泛运用到各个领域:
- 游戏(VR/AR…)
- 影视
- 工业仿生/模拟
- 数字孪生
- 全息投影
- ······
概述
1、物体与空物体
物体(Game Object),其实是一个节点或容器。一般所谓的“物体”,即有形状的东西,对应的Mesh,网格信息代表了物体(形状)。
空物体(Empty Object),即空对象、空节点。空物体不可见(没有网格),但空物体也有坐标,可以移动。空物体常用于节点的组织和管理,或用于标记一个位置。
2、父子关系
父子关系,指两个物体之间的关系。在Hierarchy窗口中,拖动物体B,到物体A下,子物体会随着父物体一并移动。删除父物体时,子物体也会一并删除。子物体的坐标是相对于父物体的,即相对坐标。
3、世界坐标系与本地坐标系
Global,即世界坐标系。以世界中心为轴,6个方向代表了上、下、东、西、南、北。
Local,即本地坐标系。以物体自身为轴,6个方向代表了上、下、前、后、左、右。
Y轴称为Up,Z轴称为Forward,X轴称为Right。一般地,在建模软件里建模时,模型的正面与Z轴的方向一致。移动一个物体时,一般就是让这个物体向前运动,Forward。
4、轴心与几何中心
Pivot,即轴心。指一个物体的操作基准点。
Center,即几何中心。对于基本体来说,轴心点默认位于几何中心,但并不是所有物体的轴心都在几何中心点。
在Unity中,默认情况下显示的是Pivot操作模式,即轴心模式。另外一种模式是几何中心点模式。可选择切换物体在移动、旋转和缩放时,是以哪个点作为操作基准点。一般使用的是Pivot模式。
5、组件
Component,即组件。代表一个具体功能,例如,Light,光源。Directional Light,平行光源。Mesh Filter,网格过滤器,用来加载网格数据。Mesh Renderer,负责渲染。
常用组件
1、摄像机
Camera,即摄像机。负责拍摄游戏画面。摄像机的Z轴指向,即为拍摄方向。拍到的画面,呈现在Game窗口中,也就是玩家最终看见的画面。
调整摄像机的角度,可用两种方式。第一种,手动。手工移动、旋转摄像机,对准目标。第二种,GameObject->Align With View,与3D视图对齐。先在3D视图里摆好角度,此为观察者视角,然后选中Main Camera,执行Align With View。此时,摄像机视角与观察者视角完全相同。
2、Transform组件
Transform,即变换组件。物体的基本参数有Position,位置(相对坐标)、Rotation,旋转(欧拉角)、Scale缩放。Transform就是用来描述一个物体在空间中的位置坐标、旋转量和缩放量。所有物体都有Transform组件,而且不能被删除。
3、AudioSource组件
AudioSource组件,用于播放音乐/音效。创建一个物体,Add Component,Audio | Audio Source,将音乐文件(*.mp3/wav/aiff)拖到AudioSource.AudioClip属性。
各类文件
1、资源文件
Assets目录下的文件,即为资源。使用Meta来描述文件,每个资源文件/文件夹,都对应一个*.meta描述文件。
常见的类型有,模型文件Model(.fbx)、图片文件Texture(.jpg/png/tif/psd等)、音频文件AudioClip(.mp3/wav/aiff)、脚本文件Script(.cs)、材质文件Material(.mat)、场景文件(.unity)等等。
2、场景文件
场景文件*.unity,记录了场景中的节点数据。包含场景全局设置、节点、节点下挂载的组件、各组件的参数值等。一个场景往往代表一个关卡,可以创建多个不同的场景。
3、资源包
Unity中的资源包(Unity Package),即对Assets下的资源进行打包。选择一个资源文件,或一个目录。右键,Export Package,生成*.unitypackage资源包。
基础知识
创建工程
(1)点击Unity hub,新建即可
提示:若无法新建可能是未登录且没有激活许可证。操作如下
工程目录介绍
在新建完成后会在创建的目录下生成相关工程文件:
Assets: 资源(场景脚本模型)
Library: 库(系统)
Logs: 日志
Packages: 导入的包
ProjectSettings: 工程设置
Temp: 临时文件(文件过大可以删除部分缓存)
UserSettings: 设置
五个窗口面板
创建完成后会有5个窗口面板(红色方框)
Project:工程面板,存放工程的各种资源。包括:声音资源、模型资源、场景文件、材质、脚本等。
Hierarchy:层级面板,展示当前打开的场景里面有哪些东西。(里面的东西称为游戏物体)
Inspector:检视面板(或属性面板),查看一个游戏物体由哪些组件组成。
场景 -> 多个游戏物体 -> 多个组件
Scene:场景面板,显示当前场景的样子
鼠标中键:平移视角
鼠标右键:旋转视角(环顾四周),围绕自身旋转
Alt+鼠标左键:渲染视角,围绕当前视角前方位置
Game:游戏面板,场景运行的时候的样子
创建代码和场景
(1)Project > Assets 右键选择create 创建 C# script ,并重命名为“New Name”右键即可打开
(2)如果使用其他版本的编译器需要去单独指定 / 代码不提示也可以用此方法解决
Edit > Preferences > External Tools (附加工具)
在External Script Editor中有俩个选项
Open by file extension——根据文件后缀名采取相应工具打开
Microsoft Visual Studio 2019(这个是自己安装的编译器)
选择“Microsoft Visual Studio 2019”因为unity大多文件是C#
脚本与编程
鼠标的输入
旋转飞车实例:
void Update()
{
/*
0:鼠标左键
1:鼠标右键
2:鼠标中键
*/
if (Input.GetMouseButtonDown(0))
{
Debug.Log("鼠标按下");
rotateSpeed = 900f;
moveSpeed = 300f;
}
if (Input.GetMouseButtonUp(0))
{
Debug.Log("鼠标抬起");
rotateSpeed = 0f;
moveSpeed = 0f;
}
this.transform.Rotate(0, rotateSpeed * Time.deltaTime, 0, Space.Self);
this.transform.Translate(0, 0, moveSpeed * Time.deltaTime, Space.World);
}
相关API:
- GetMouseButtonDown:鼠标按下
- GetMouseButtonUp:鼠标抬起
- GetMouseButton:状态探测,只要鼠标按下,会一直调用。
旋转飞车实例2:
void Update()
{
/*
0:鼠标左键
1:鼠标右键
2:鼠标中键
*/
if (Input.GetMouseButton(0))
{
rotateSpeed = 900f;
moveSpeed = 300f;
}
else
{
rotateSpeed = 0;
moveSpeed = 0;
}
this.transform.Rotate(0, rotateSpeed * Time.deltaTime, 0, Space.Self);
this.transform.Translate(0, 0, moveSpeed * Time.deltaTime, Space.World);
}
&一些补充的工具函数
//获取到鼠标点击的位置坐标
Vector3 mousePos = Input.mousePosition;
//获取到屏幕的尺寸
int screenWidth = Screen.width;
int screenHeight = Screen.height;
//获取物体的屏幕坐标
Vector3 pos = this.transform.position;
Vector3 screenPos = Camera.main.WorldToScreenPoint(pos);
键盘的输入
常用API:
Input.GetKeyDown(key):按键事件,按下
Input.GetKeyUp(key):按键事件,抬起
Input.GetKey(key):案件状态,是否正被按下
代码来操作组件
操作AudioSource组件
//获取到AudioSource组件(泛型)
AudioSource audio = this.GetComponent<AudioSource>();
//播放
audio.Play();
引用别的组件:
应用场景:在主控结点中操作背景音乐的组件
public class MainLogic : MonoBehaviour
{
//public GameObject bgmNode;
//引用扬声器组件
public AudioSource bgm;
//引用脚本组件
public FanLogic fan;
//风扇转速
public float rotateSpeed;
void Start(){
//AudioSource audio = bgmNode.GetComponent<AudioSource>();
//audio.Play();
bgm.Play();
}
void Update(){
if(Input.GetMouseButtonDown(0))
{
rotateSpeed = 800;
//旋转代码在FanLogic脚本下
}
}
}
获取物体API
案例:主控结点下找到无人机目录下的旋翼对象,并调用它的脚本组件
//主控结点
//方式二:(在Unity中拖入)
public GameObject wingNode;
//方式一:
void Start(){
GameObject node = GameObject.Find(无人机/旋翼);
RotateLogic rotateLogic = node.GetComponent<RotateLogic>();
}
获取游戏节点的父级与子级:
//获取当前组件的父结点与父方位
Transform parent = this.transform.parent;
GameObject parentNode = this.transform.parent.gameObject;
//获取子结点的方位
//方式一:通过foreach遍历
foreach (Transform child in transform)
{
Debug.Log("子物体" + child.name); //child
}
//方式二:通过GetChild()索引API
Transform child = this.transform.GetChild(0);
//方式三:通过名字查找子项
Transform child = this.transform.Find("子项名或路径");
给物体设置新的父级:
this.transform.SetParent(null/GameObject);
切换物体的显示状态:
Transform child = this.transform.Find("xxx");
if(child.gameObject.activeSelf)
{
//隐藏
child.gameObject.SetActive(false);
}
else
{
//显示
child.gameObject.SetActive(true);
}
资源的使用API
用户按下A,D键播放音效成功与失败
//成功音效
public AudioClip audioSuccess;
//失败音效
public AudioClip audioFail;
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
AudioSource audio = GetComponent<AudioSource>();
audio.PlayOneShot(audioSuccess);
}
if (Input.GetKeyDown(KeyCode.D))
{
AudioSource audio = GetComponent<AudioSource>();
audio.PlayOneShot(audioFail);
}
}
制作随机音乐盒程序
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MusicBox : MonoBehaviour
{
public AudioClip[] songs;
// Start is called before the first frame update
void Start()
{
if (songs == null || songs.Length == 0)
{
Debug.Log("当前歌单列表为空!");
}
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
NextSong();
}
}
private void NextSong()
{
//随机播放
int randomIndex = Random.Range(0, songs.Length);
//取到AudioSource组件
AudioSource audio = GetComponent<AudioSource>();
audio.clip = this.songs[randomIndex];
audio.Play();
Debug.Log("正在播放第" + (randomIndex+1) + "首歌,歌名为:" + audio.clip.name);
}
}
定时调用与线程
Unity是单线程核心,暂时不必考虑线程,调度,并发。
//延迟调用API
this.Invoke("函数名",延迟时间);
//循环调用API
this.InvokeRepeating("函数名",循环时间间隔);
//查看当前线程的ID
int ThreadId = Thread.CurrentThread.ManagedThreadId;
//判断函数是否正在被调用
bool isInvoking = IsInvoking("函数名");
//取消该函数的调用
CancelInvoke("函数名");
//取消当前脚本所有Invoke调用
CancelInvoke();
向量的基本运算
//定义一个三维向量
Vector3 v1 = new Vector3(3,0,4);
//求向量的模长
float length = v1.magnitude;
//向量标准化
Vector3 v2 = v1.normalized;
//物体运动的优化写法
//定义一个三维向量来表示不同方向的速度
public Vector3 speed;
//优化物体移动写法
void Update()
{
this.transform.Translate(speed * Time.deltaTime,Space.Self);
}
预制体与实例
通过API创建实例:
- 首先准备子弹的预制体prefab
- 添加火控脚本 FireLogic.cs
//子弹预制体
public GameObject bulletPrefab;
//子弹目录
public Transform bulletFolder;
//子弹出生点
public Transform firePoint;
//炮塔的引用(为了获取到炮塔发射子弹的方向)
public Transform cannon;
void Update()
{
//创建实例
GameObject node = Object.Instantiate(bulletPrefab,bulletFolder);
//指定出生点
node.transform.position = this.firePoint.position;
//指定初始角度
node.transform.localEulerAngles = this.cannon.eulerAngles;
//子弹脚本参数的设置(子弹飞行速度)
node.GetComponent<BulletLogic>().setSpeed(0.5f);
}
- 销毁子弹
//销毁自身结点的API
Object.Destroy(this.gameObject);
//注意不要写错,写为⬇,该写法是销毁组件,而并非结点
Object.Destroy(this);
物理系统与组件
Physic—>RigidBody:刚体组件
常用属性:
- Mass:质量
- Drag:摩擦力
- AngularDrag:角摩擦力
…
Physic—>Collider:碰撞模型
常用类型:BoxCollider,SphereCollider
物理材质Phsicas Material:
- 在Assets中添加一个Physics Material
- 在里面设置全局性的摩擦力Friction,弹性系数等等
碰撞检测
实现 碰撞检测的步骤:
- RigidBody–>is Kinematic 勾选标记为 运动学刚体
- Collider–>is Tragger 勾选 标记为触发器
- 挂一个脚本,添加消息函数⬇
void OnTriggerEnter(Collider other)
{
//拿到被碰撞物体的名字
string name = other.name;
//销毁被碰撞物体
Object.Destroy(other.gameObject);
Object.Destroy(this.gameObject);
}
案例实操作
3D 射击游戏实战
-
1.导入模型
-
2.更改天空盒
Window—>Rendering—>lighting—>environment—>Skybox Material
-
3.添加子弹,模型,材质,脚本等
-
4.给子弹和怪兽添加碰撞检测
-
5.子弹的自动发射,自毁与预制体
-
6.玩家的按键操作
-
7.怪兽的走位移动
-
8.怪兽生成器
-
9.子弹和爆炸特效
源码展示:
子弹BulletLogic:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
子弹相关逻辑:
准备工作:子弹的预制体以及导入工程
1.子弹的Z轴移动
2.子弹的自毁
3.子弹的特效导入
*/
public class BulletLogic : MonoBehaviour
{
//设置子弹的运动速度
[Tooltip("子弹飞行速度")]
public Vector3 speed;
[Tooltip("子弹飞行时长")]
public float lifetime = 5f;
[Tooltip("子弹爆炸特效预制体")]
public GameObject explosionEffect;
// Start is called before the first frame update
void Start()
{
Invoke("SelfDestroy", lifetime);
}
// Update is called once per frame
void Update()
{
this.transform.Translate(speed, Space.Self);
}
//触发器函数
private void OnTriggerEnter(Collider other)
{
Debug.Log("发生碰撞了");
//如果碰撞到怪兽
if (!other.name.StartsWith("怪兽")) return;
Destroy(this.gameObject);
Destroy(other.gameObject);
//创建一个爆炸粒子特效对象
GameObject node = Object.Instantiate(explosionEffect,null);
node.transform.position = this.transform.position;
//当粒子特效播放完成时自动销毁
}
//子弹自毁函数
private void SelfDestroy()
{
Debug.Log("子弹已自毁");
Destroy(this.gameObject);
}
}
玩家PlayerLogic:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
玩家相关逻辑:
准备工作:导入玩家模型的预制体资源
1.设置子弹发射点,并实现从该点定时发射子弹
2.添加玩家的按键控制移动
*/
public class PlayerLogic : MonoBehaviour
{
//预制体资源
public GameObject bulletPrefab;
//子弹生成目录
public Transform bulletFolder;
//子弹发射点
public Transform firePoint;
//子弹发射间隔
public float fireInterval;
//玩家移动速度
public float playerSpeed;
// Start is called before the first frame update
void Start()
{
InvokeRepeating("fire", fireInterval, fireInterval);
}
// Update is called once per frame
void Update()
{
float speedX = 0;
//按键控制
if (Input.GetKey(KeyCode.A))
{
speedX = -playerSpeed;
}
else if (Input.GetKey(KeyCode.D))
{
speedX = playerSpeed;
}
else
{
speedX = 0;
}
this.transform.Translate(speedX * Time.deltaTime, 0, 0, Space.Self);
}
//发射子弹的函数
private void fire()
{
//生成一个子弹实例
GameObject bullet = Object.Instantiate(bulletPrefab, bulletFolder);
//设置子弹的出生点
bullet.transform.position = this.firePoint.position;
}
}
怪兽EnemyLogic:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
怪兽相关逻辑:
准备工作:导入怪兽的预制体进工程
1.水平速度的蛇皮走位逻辑
2.前后速度的固定逻辑
*/
public class EnemyLogic : MonoBehaviour
{
//水平速度
float speedX = 0;
//前后速度
public float speedZ;
// Start is called before the first frame update
void Start()
{
//重复周期调用蛇皮走位
InvokeRepeating("move", 0.1f, 0.5f);
}
// Update is called once per frame
void Update()
{
this.transform.Translate(speedX * Time.deltaTime, 0, speedZ * Time.deltaTime, Space.Self);
}
//怪兽的蛇皮走位
private void move()
{
//设置一个随机速度数组
float[] speed = { -5, -10, -20,-30, 5, 10, 20 ,30};
//随机选取一个速度作为水平速度
int rnum = Random.Range(0, speed.Length);
//设置速度
speedX = speed[rnum];
}
}
怪兽生成器EnemyCreator:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
怪兽生成器相关逻辑:
1.定时生成怪兽即可
*/
public class EnemyCreator : MonoBehaviour
{
//要创建的怪兽预制体
public GameObject enemyPrefab;
//创建怪物间隔时长
public float enemyInterval = 0.5f;
// Start is called before the first frame update
void Start()
{
InvokeRepeating("creatEnemy", 0.1f, enemyInterval);
}
// Update is called once per frame
void Update()
{
}
private void creatEnemy()
{
GameObject node = GameObject.Instantiate(enemyPrefab, this.transform);
node.transform.position = this.transform.position;
//调整随机出生点
int rnum = Random.Range(-50, 50);
node.transform.Translate(rnum, 0, 0, Space.Self);
}
}
快捷键
command+N 新建场景
command+O 打开场景
command+S 保存场景
Shift + command + S 场景另存为
Shift + command + B 编译设置
command + B 编译并运行
command + z Undo 撤销
shift + command + z Redo 撤销
command + X Cut剪切
command + C Copy拷贝
command + V Paste粘贴
command + D Duplicate 复制
shift + Del Delete 删除
command + F 查找
command + A 全选
command + P Play播放
Shift + command + P Pause暂停
Alt + command + P step停止
command + R Refresh 刷新
Shift + command + N 新建空GameObject
Alt + command + F Move to View 移动到视图
Shift + command + F Align with View 视图对齐
command + 1 选择Scene视图
command + 2 选择Game视图
command + 3 选择Inspector面板
command + 4 选择Hierarchy 视图
command + 5 选择Project 视图
command + 6 打开Animation动画窗口
command + 7 打开Profilter分析器
command + 8 打开Particle Effect 粒子窗口
command + 9 打开Asset store资源商店
command + 0 打开Asset server资源服务器
shift + command + C 打开Console 控制台
Q 切换平移模式
W 切换移动模式
E 切换旋转模式
R 切换缩放模式
Z Pivot Mode toggle 轴点模式切换
X Pivot Rotation toggle 轴点旋转切换
一、变换工具 6个
快捷键Q–Hand(手形)工具 可以平移整个Scene视图
快捷键W–Translate(移动)工具 移动所选择的游戏对象
快捷键E–Rotate(旋转)工具 按任意角度旋转游戏对象
快捷键R–Scale(缩放)工具 缩放选中的游戏对象
快捷键T–横切面工具 可以沿着横截面缩放,沿着横截面的中心点旋转
快捷键Z–Center工具 改变游戏对象的轴心点
快捷键X–Local工具 改变物体的坐标
二、播放控件 3个
Ctrl+P–播放按钮 播放/运行,对游戏场景进行预览
Ctrl+Shift+P–暂停按钮 暂停/中断,停止预览
Ctrl+Alt+P–逐帧播放按钮 单帧进行预览
以上一、二为工具栏的快捷键
三、File(文件)菜单快捷键 6个
Ctrl+N–New Scene 新建场景
Ctrl+O–Open Scene 打开场景
Ctrl+S–Save Scene 保存场景
Ctrl+Shift+S–Save Scene as 场景另存为
Ctrl+Shift+B–Build Setings 发布设置
Ctrl+B–Build & Run 发布并运行
四、Edit(编辑)菜单 11个
(在Mac机中,用command键替换Ctrl,以下出现的Ctrl均同)
Ctrl+Z–Undo Selection Change 撤销上一步操作
Ctrl+Y–Redo 反撤销(mac机为command+Shift+Z)
Ctrl+X–Cut 剪切
Ctrl+C–Copy 复制
Ctrl+V–Paste 粘贴
Ctrl+D–Duplicate 复制并粘贴
Shift+Del–Delete 删除(mac机位command+Del)
快捷键F–Frame Selected 居中并最大化当前选中的物体
Ctrl+F–Find 搜索,按照名称查找物体
Shift+F–Lock view to Selected 锁定搜索到的物体
Ctrl+A–Select All 选择全部
五、Assets菜单快捷键 1个
Ctrl+R–Refresh 刷新场景
六、GameObject菜单快捷键 5个
Ctrl+Shift+N–Create Empty 创建一个空的游戏对象
Alt+Shift+N–Create Empty Child 创建一个空的子物体
Ctrl+Alt+F–Move to New 移动游戏对象到视图的中心点
Ctrl+Shift+F–Align With View
Alt+Shift+A–Toggle Active Stave
七、Component菜单快捷键
Ctrl+Shift+A–add 添加组件
八、切换视图快捷键 12个
Ctrl+Tab切换–next Windows 下个窗口
Ctrl+Shift+Tab切换–Previous Windows 上个窗口
Ctrl+1切换–Scene视图
Ctrl+2切换–Game视图
Ctrl+3切换–Inspector视图
Ctrl+4切换–Hierarchy视图
Ctrl+5切换–Project视图
Ctrl+6切换–Animation视图
Ctrl+7切换–Profiler视图
Ctrl+9切换–Asset Store Unity资源商店
Ctrl+0切换–Asset Server 资源服务器
Ctrl+Shift+C切换–Console 控制台
以上三~八为菜单栏快捷键
九:操作Scene视图的快捷键
Alt+鼠标左键–旋转视图
Alt+鼠标右键–放大缩小视图
Alt+鼠标中键–移动视图
鼠标右键+w/s/a/d–向上/下/左/右 飞行浏览视图
鼠标右键+w/s/a/d+Shift–向上/下/左/右 快速飞行浏览视图
来源
unity入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
【Unity篇】Unity入门介绍
Unity3D入门基础知识
Unity3D入门篇