【Unity】入门

【Unity】入门Unity 已广泛运用到各个领域 游戏 VR AR 影视 工业仿生 模拟 数字孪生 全息投影 unity 教程

大家好,欢迎来到IT知识分享网。

Unity已广泛运用到各个领域:

  • 游戏(VR/AR…)
  • 影视
  • 工业仿生/模拟
  • 数字孪生
  • 全息投影
  • ······

概述

Unity3D游戏开发需要学习的内容相当丰富,主要涵盖了以下几个方面:

  • Unity引擎的基本操作与概念:首先,你需要熟悉Unity编辑器的使用,包括其界面布局、基本操作以及核心概念,如场景、游戏对象和组件等。理解这些基本概念是后续学习的基础。
  • C#编程语言:Unity3D使用C#作为主要的脚本编程语言,因此你需要掌握C#的基本语法、面向对象编程的概念以及常用的编程技巧。这包括如何定义和使用变量、函数和类,以及如何实现游戏的交互逻辑和功能。
  • 游戏设计与美术技能:了解游戏设计原则和流程,包括关卡设计、角色设计、用户界面设计等。同时,你也需要学习一些美术方面的技能,如图形设计、3D建模、纹理制作和动画制作等,以便能够创建出具有吸引力的游戏视觉效果。
  • 物理与数学知识:理解数学和物理在游戏开发中的应用,包括向量计算、碰撞检测、运动模拟等。这些知识对于实现游戏特效、物理模拟和游戏机制设计非常重要。
  • 特效与音频技能:学习如何创建粒子特效、光影效果、渲染优化等,以提升游戏的视觉效果。同时,了解音频处理和混音技术,能够为游戏添加适当的音效和背景音乐。
  • 协作与沟通能力:游戏开发是一个团队合作的过程,因此你需要具备良好的协作和沟通能力,能够与团队成员有效地交流和合作。

空物体(Empty Object),即空对象、空节点。空物体不可见(没有网格),但空物体也有坐标,可以移动。空物体常用于节点的组织和管理,或用于标记一个位置。

Local,即本地坐标系。以物体自身为轴,6个方向代表了上、下、前、后、左、右。

Y轴称为Up,Z轴称为Forward,X轴称为Right。一般地,在建模软件里建模时,模型的正面与Z轴的方向一致。移动一个物体时,一般就是让这个物体向前运动,Forward。

Center,即几何中心。对于基本体来说,轴心点默认位于几何中心,但并不是所有物体的轴心都在几何中心点。

在Unity中,默认情况下显示的是Pivot操作模式,即轴心模式。另外一种模式是几何中心点模式。可选择切换物体在移动、旋转和缩放时,是以哪个点作为操作基准点。一般使用的是Pivot模式。

常用组件

调整摄像机的角度,可用两种方式。第一种,手动。手工移动、旋转摄像机,对准目标。第二种,GameObject->Align With View,与3D视图对齐。先在3D视图里摆好角度,此为观察者视角,然后选中Main Camera,执行Align With View。此时,摄像机视角与观察者视角完全相同。

各类文件

常见的类型有,模型文件Model(.fbx)、图片文件Texture(.jpg/png/tif/psd等)、音频文件AudioClip(.mp3/wav/aiff)、脚本文件Script(.cs)、材质文件Material(.mat)、场景文件(.unity)等等。

基础知识

创建工程

在这里插入图片描述

工程目录介绍

在新建完成后会在创建的目录下生成相关工程文件:

五个窗口面板

创建完成后会有5个窗口面板(红色方框)

在这里插入图片描述
Project:工程面板,存放工程的各种资源。包括:声音资源、模型资源、场景文件、材质、脚本等。

Hierarchy:层级面板,展示当前打开的场景里面有哪些东西。(里面的东西称为游戏物体)

创建代码和场景

(2)如果使用其他版本的编译器需要去单独指定 / 代码不提示也可以用此方法解决

脚本与编程

鼠标的输入

旋转飞车实例:

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); 

物理系统与组件

  • Mass:质量
  • Drag:摩擦力
  • AngularDrag:角摩擦力

物理材质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–向上/下/左/右 快速飞行浏览视图

来源


免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/119656.html

(0)
上一篇 2025-11-03 22:10
下一篇 2025-11-03 22:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信