1.场景视图
鼠标滚轮:场景放大缩小
鼠标右键:场景左右平移
场景编辑器中,能看到什么?
网格,每一格大小为1unit,建模不同,规定不同,(对应屏幕上100个像素)
世界坐标系
y轴向上为正
x轴向右为正
z轴垂直屏幕向里,为正
主摄像机Main Camera:表示摄像机的可视范围
1.1坐标单位
坐标的单位:一个方格为个单位(Unit),默认的,竖直方向为±Unit
一个单位在屏幕上,约定为100像素
一个单位在真实世界中,可以自行约定,比如约定1单位=1米
1.2摄像机
Z坐标,默认是-10,不用修改
Background,默认蓝色,游戏运行时的背景色
Size广角,指摄像范围,默认5个单位
其中,5 Unit为半高,全高为5 * 2 = 10 Unit
长度比:长宽比由Game窗口中的显示Display决定
比如:设为Free Aspect
设为16:9
即,摄像机的高度由Size决定,而宽度是不确定的
在准备背景图片时
摄像机 Size = 5
图片高度:10Unit * 100 = 1000 px
图片宽度:按16:9准备,最好更宽一些,以覆盖更宽屏幕
摄像机 Size = 3.6
图片高度:7.2Unit * 100 = 1000 px
图片宽度:应比1280略大一些,以覆盖更宽屏幕
ctrl +z撤销上一步操作
对象的显示顺序
在2D画面中,两个对象如果重叠,谁显示在上面呢?
修改Order In Layer(推荐)
修改Z坐标
即使一个对象被遮住,也是可以操作的
Hierarchy窗口中的先后顺序,并不能决定显示顺序
1.3对象的轴心
轴心的作用
坐标基准
当设置对象的坐标时,实际指的是轴心点的位置
旋转轴
当旋转对象时,是以Pivot为轴心来计算的
Pivot的设置
选中一个图片素材
在Inspector窗口中,点Sprite Editor,打开一个图形编辑器
在Sprite编辑器的右下角面板里,设定Pivot位置
在Sprite编辑器的右上角,点Apply保存设置
理解相对坐标
对象的父子关系:拖拽一个对象到另一个对象,成为子对象(子节点),可以发现,当父对象移动时,子对象随之移动
子对象的坐标轴,是相对于父对象的
移动父对象时,子对象的Position不发生变化
旋转父对象时,子对象的Rotation不发生变化
1.4图片素材的准备
2D图片的要求:
背景图片,一般为JPG
人物,道具等其他图片,一般为PNG,背景透明
图片的切割
一个图片未经切割时,只包含一个sprite素材
在Sprite Mode里设置Multiple,然后点击Sprite Editor,弹窗点击Apply
按照图中操作即可
切割结果
图片与渲染器
两个术语
Sprite精灵,游戏开发中指一张图片
Sprite Renderer 图片渲染器,用于显示一个Sprite,功能就是显示图片
组件Component,用于实现一种功能
例如,Sprite Renderer组价,用于图片显示
2.认识脚本组件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Hello : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
添加脚本时,自动创建一个类*.cs文件
特点:
类名必须与文件名相同
必须继承于MonoBehavior
所有Unity脚本都继承于这个类
默认定义了一些事件函数
如:Start(), Update(),会被Unity引擎自动调用
事件方法
事件方法Event Function 约定好的一些事件回调
如:Start()每次开始时调用一次,Update()每帧调用,更新游戏显示
Time.delta Time()获取上一次Update()到现在的时间间隔
内部执行顺序
创建游戏对象
创建组件 如:Hello comp = new Hello()
comp.Start()
定时执行 comp.Update()更新游戏显示
要点与细节
类名必须与文件名相同
Start()开始调用一次,可用于初始化,Update()每帧调用,帧间隔不等,可用于更新游戏
帧率
默认Unity里帧率是不固定的,它会尽可能快的刷新游戏
获取上一帧的间隔:Time.deltaTime
显式设定帧率:
Application.targetFrameRate = 50;
Application.targetFrameRate = 50;
要求Unity引擎尽量以此帧率运行,但实际帧率还是会有偏差
对象的移动
在Update()里移动图片,每次向上移动0.05单位
this.transform.Translate(0, 0.05f, 0);
其中,
this.transform 即当前游戏对象的transform组件
Translate()调整相对位移
匀速移动的优化
float step = 0.8f * Time.deltaTime;
其中,0.8f表示每秒移0.8个单位
要点
Unity中一般使用float,而不是double,所以在指定参数时要以f结尾,例如0.8f
注意理解Time.deltaTime的使用
{
// Start is called before the first frame update
void Start()
{
Debug.Log("这是我的第一个游戏");
Application.targetFrameRate = 60;
}
// Update is called once per frame
void Update()
{
Debug.Log("In Update()..." + Time.deltaTime);
//this.transform.Translate(0, 0.05f, 0);
float step = 0.8f * Time.deltaTime;
this.transform.Translate(0, step, 0);
}
}
Unity官方文档 https://unity.cn
Manual 手册
Script API
可以切换语言,版本,可供参考
3.Script API
获取节点和组件
获取当前节点,以及当前节点下的组件
获取其他节点,以及其他节点下的组件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyJet : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//SpriteRenderer renderer = this.gameObject.GetComponent<SpiteRendeer>();
//SpriteRenderer renderer = GetComponent<SpriteRendeer>();
//renderer.flipY = true;
//获取其他节点
GameObject obj = GameObject.Find("/other/22");
SpriteRenderer comp = obj.GetComponent<SpiteRendeer>();
comp.flipY = true;
}
// Update is called once per frame
void Update()
{
}
3.1MonoBehaviour
所有的Unity脚本,都继承自MonoBehaviour
查看MonoBehaviour文档
-- enabled 此组件是启用/禁用
-- gameobject,当前游戏对象
-- transform,当前Transform组件
-- name,当前游戏对象的名称
链接:https://docs.unity.cn/cn/current/ScriptReference/MonoBehaviour.html
3.2父节点与子节点
查看Transform文档,它有两个作用:
--用于设置Position/Rotation/Scale
--用于维持父子节点关系
比如:获取一个节点的父节点/子节点
3.3组件的属性
脚本组件的属性,也可以在Inspector窗口里显示
演示:给myJet.cs添加几个属性
public int number = 10;
public string helloMessage = "hi,afanihao";
public float speed = 1.2f;
完整代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyJet : MonoBehaviour
{
public int number = 10;
public string helloMessage = "hi,afanihao";
public float speed = 1.2f;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.Translate(0, speed * Time.deltaTime, 0);
}
}
要点与细节
只有public属性才在Inspector里显示
在Inspector里可以修改初始值,也可以添加引用类型的属性,如图片资源、游戏对象、组件等
3.4脚本的单步调试
Unity程序调试
-- 打印输出Debug.Log()
-- 单步调试
-- 在运行状态时,可以在Hierarchy / Inspector里直接修改
如果在VS环境安装正确的话,可以对脚本单步调试
在VS里,添加断点
在VS里,附加到Unity(Attach)
在Unity里,点Play
在VS里,点Step Over(F10)单步调试
在VS里,点停止调试(Detach)使用VS与Unity分离,此时,并没有停止游戏,只是停止调试让它自由运行
要点与细节
Unity和VS两个庞然大物,Attach需要时间,不要频繁乱点
点停止调试时,并没有停止游戏的运行
有一个固态硬盘最好,把项目放在固定分区之上
4.坐标系与旋转
4.1坐标与旋转
Vector3,用于表示一个3维向量(x, y, z),也称3元数
比如,节点的坐标用Vector3类型表示
tranform.position = new Vector3(0, 1.0f, 0);
节点的坐标、旋转,都是Vector3表示
比如:
transform.position = new Vector3(0, 1.0f, 0);
transform.eulerAngles = new Vector3 (0, 0, 45f);
其中,Euler Angle称为欧拉角,就是用直观地角度来表示旋转
注意:另外transform.rotation 是用Vector4表示旋转,较为复杂
4.2世界坐标和本地坐标
世界坐标,World Space Position以世界坐标系计算
本地坐标,Local Space Position以父节点的坐标系计算
如,添加一个小鸟,作为佩奇的子节点
给小鸟指定本地坐标
transform.localPosition = new Vector3(0, 4.0f, 0);
transform.localEulerAngles = new Vector3 (0, 0, 90f);
要点与细节
指定旋转角度时,用eulerAngles或者localEulerAngles
4.3物体的运动
transform.Translate(dx, dy, dz)用于实现相对运动,即在原始位置上偏移dx, dy, dz的距离
如:沿Y轴方向移动0.02单位
transform.Translate(0, 0.02f, 0, Space.Self)
其中,Space.Self表示使用佩奇自己的坐标系
测试1:将佩奇旋转45度,运行游戏
测试2:将佩奇旋转180度,运行游戏
可以发现佩奇是沿自己的Y轴方向移动的
Space.Self是用自己的坐标系(默认值)
Space.World使用世界坐标系
transform.Translate(0, 0.02f, 0, Space.World)
4.4掉头飞行
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyJet : MonoBehaviour
{
private bool upward = true; //飞行的方向
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if(upward && transform.position.y > 5)
{
upward = false;
transform.localEulerAngles = new Vector3(0, 0, 180);
}
if(!upward && transform.position.y < -5)
{
upward=true;
transform.localEulerAngles = new Vector3(0, 0, 0);
}
transform.Translate(0, 0.02f, 0, Space.Self);
}
}
理解
Translate()是相对运动