正交相机(Orthographic Camera)

Unity3D中的正交相机(Orthographic Camera)是一种投影方式,它不同于透视相机(Perspective Camera)的投影方式。在正交相机中,物体在视野中的大小与其与相机的距离无关,也就是说,所有物体在相机视野中呈现的大小是相同的。

Unity3D的正交相机可以看作是一个在固定位置的照相机,它将三维空间中的物体投影到一个二维图像平面上,而不考虑物体到相机的距离。因此,在正交投影中,无论物体离相机多远,它们在二维图像平面上的大小都不会改变。

正交相机的投影方式是通过一个虚拟的长方体来取景,并将场景投影到这个长方体的前面。在Unity中,可以通过更改相机参数来调整这个长方体的尺寸,进而影响相机视野中物体的显示大小。

主要特点和应用场景

物体大小不变

由于正交相机不考虑物体到相机的距离,所以物体在相机视野中的大小是固定的,这使得在2D游戏或者UI设计中非常方便。

无透视收缩效果

在正交投影中,远处的物体和近处的物体在图像平面上的大小是相同的,不会有透视收缩效果,这使得场景中的物体之间的相对距离
保持不变。

适用于2D游戏和UI设计

正交相机由于其特殊的投影方式,非常适合用于2D游戏和UI设计,可以很容易地实现平铺纹理或者背景等效果。

易于实现像素化效果

正交相机由于物体大小固定,所以可以很容易地实现像素化效果,这在一些复古风格的2D游戏中非常常见。

总的来说,Unity3D的正交相机通过忽略物体到相机的距离,实现了一种特殊的投影方式,这种方式在2D游戏和UI设计中有广泛的应用。

正交相机的主要属性

- 投影模式(Projection Type)

这是设置相机投影方式的属性,Unity中提供了多种投影模式,但对于正交相机来说,通常只会选择“正交(Orthographic)”这一项。
选择正交投影后,相机的视野不会因物体距离的增加而产生大小变化。

- 视野大小(Field of View)

在正交投影中,视野大小实际上定义了相机的视锥体的大小,它决定了相机的可视范围。Unity中是以角度来定义的,数值越大,
视野范围越宽。

- 近平面(Near Plane)和远平面(Far Plane)

这两个属性定义了相机视锥体的近边界和远边界。在正交相机中,这两个平面是固定垂直于相机前后的,不会因为相机的移动而改变。
近平面和远平面的距离决定了相机的深度范围。

- 正交尺寸(Orthographic Size)

这个属性定义了相机的虚拟长方体视野的尺寸。相机将场景投影到一个虚拟的长方体上,这个长方体的长、宽、高分别由正交尺寸的
X、Y、Z分量决定。物体在相机视野中的大小实际上是由这个长方体的尺寸决定的。例如,如果正交尺寸的X为10,Y为5,那么相机视野
的宽高比就是2:1。

- 平移(Position)

这是相机在三维空间中的位置,可以自由设置。

- 旋转(Rotation)

这是相机在三维空间中的旋转,同样可以自由设置。旋转会影响相机的朝向,从而改变拍摄的视角。

- 缩放(Scale)

在Unity中,相机也有缩放属性,但这通常指的是相机视锥体的缩放,而不是像物体一样改变大小。这个属性在正交相机中不太常用。
阅读全文 »

鼠标键盘

鼠标键盘输入控制,Input类,要在Update()函数中检测

鼠标点击

0左键 1右键 2滚轮

按下鼠标左键:

Input.GetMouseButtonDown(0)

持续按下鼠标左键:

Input.GetMouseButton(0)

抬起鼠标左键:

Input.GetMouseButtonUp(0)

GetMouseButtonDown()和GetMouseButtonUp()成对出现

按钮键盘按键

KeyCode 枚举

按下键盘A键:

Input.GetKeyDown(KeyCode.A)

持续按下A键:

Input.GetKey(KeyCode.A)

抬起键盘按键:

Input.GetKeyUp(KeyCode.A)

GetKeyDown() 和 GetKeyUp()成对出现

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Update is called once per frame
void Update()
{
//鼠标点击
//按下鼠标 0左键 1右键 2滚轮
if (Input.GetMouseButtonDown(0))
{
Debug.Log("按下了鼠标左键");
}
//持续按下
if (Input.GetMouseButton(0))
{
Debug.Log("持续按下鼠标左键");
}
//抬起鼠标
if (Input.GetMouseButtonUp(0))
{
Debug.Log("抬起了鼠标左键");
}

//键盘
//按下键盘
if (Input.GetKeyDown(KeyCode.A))
{
Debug.Log("按下A键");
}
//持续按下A键
if (Input.GetKey(KeyCode.A))
{
Debug.Log("持续按下A键");
}
//抬起键盘按键
if (Input.GetKeyUp(KeyCode.A))
{
Debug.Log("松开抬起A键");
}
}
阅读全文 »

Transform维持物体之间的父子级

获取位置

获取世界空间中的位置: transform.position
相对父物体位置: transform.localPosition

获取旋转

获取物体在世界空间旋转值(四元素):transform.rotation
获取物体相对父物体旋转值(四元素):transform.localRotation
获取物体在世界空间旋转值(Euler 度为单位): transform.eulerAngles
获取物体相对父物体旋转值(Euler 度为单位): transform.localEulerAngles

获取缩放

获取物体相对父物体缩放比: transform.localScale

向量

前方(Z轴方向):transform.forward
右方(X轴方向):transform.right
上方(Y轴方向):transform.up

父子关系

父物体: transform.parent.gameObject
子物体数量: transform.childCount
通过子物体名称找子物体: transform.Find("childObjName").gameObject
通过索引位置找子物体: transform.GetChild(0).gameObject

常用方法

在 Update() 方法中调用

- 时刻看向指定位置

transform.LookAt(Vector3.zero)

- 旋转

按自身Y轴方向,每侦1度进行旋转(自转):transform.Rotate(Vector3.up,1)

- 围绕某个物体旋转

围绕某个物体旋转(世界坐标(0,0,0)的点的Y轴): transform.RotateAround(Vector3.zero,Vector3.up,5)
阅读全文 »

场景类 Scene

- 获取当前活动场景

Scene scene = SceneManager.GetActiveScene();

- 场景名称

Debug.Log(scene.name);

- 是否加载

Debug.Log(scene.isLoaded);

- 场景路径

Debug.Log(scene.path);

- 场景索引

Debug.Log(scene.buildIndex);

- 获取场景内物体数量

GameObject[] objs = scene.GetRootGameObjects();
Debug.Log(objs.Length);

场景管理类 SceneManager

- 创建场景

SceneManager.CreateScene("NewScene");

- 加载场景(同步/异步)

  1. 同步加载场景

    SceneManager.LoadSceneAsync(“Scene2”,LoadSceneMode.Additive);

  2. 异步加载场景 协程

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class SceneTest : MonoBehaviour
{
float timer = 0;
AsyncOperation operation;

// Start is called before the first frame update
void Start()
{
//异步加载场景 协程
StartCoroutine(LoadScene());
}

IEnumerator LoadScene()
{
operation = SceneManager.LoadSceneAsync("Scene2",LoadSceneMode.Additive);
//场景是否立即激活
operation.allowSceneActivation = false;
yield return operation;
}

// Update is called once per frame
void Update()
{
Debug.Log(operation.progress);
timer += Time.deltaTime;
if (timer > 5)
{
//5秒后激活加载的场景
operation.allowSceneActivation = true;
}
}
}

Application

- 游戏数据文件夹路径(只读,打包加密压缩)

Debug.Log(Application.dataPath);  
D:/UnityTest/TestUnity2021Project/New Unity Project/Assets

- 持久化文件夹路径

Debug.Log(Application.persistentDataPath);
C:/Users/gongrenjun/AppData/LocalLow/DefaultCompany/New Unity Project

- StreamingAssets文件夹路径(只读,配置文件,打包后不会加密压缩)

Debug.Log(Application.streamingAssetsPath);
D:/UnityTest/TestUnity2021Project/New Unity Project/Assets/StreamingAssets

- 临时文件夹

Debug.Log(Application.temporaryCachePath);
C:/Users/GONGRE~1/AppData/Local/Temp/DefaultCompany/New Unity Project

- 是否在后台运行 可在Projectt Settins -> Player 选项中设置

Debug.Log(Application.runInBackground);

- 打开URL

Application.OpenURL("http://www.bytefisher.top");

- 退出游戏

Application.Quit();

2月24日,星期六

元宵节,气温骤降。在这样的日子里,我选择前往三一水库挑战红尾。为了应对可能的挑战,跟据以往的经验,由于水库红尾比较小,我准备选择软竿,搭配小钩,细线,希望能提高鱼儿的咬钩。于是我携带了特作伊吹12尺钓竿,搭配0.6主线,0.3子线以及2号无倒刺轻口袖进行作钓。

虽然降温,但鱼口异常的好,仿佛在庆祝元宵节的热闹。到达水库开始作钓不久,就开始上鱼。红尾虽然小,但数量众多,鱼情爆躁。然而,特作伊吹钓竿在这个时候却显得有些不适应,小鱼刺鱼过程中手感模糊,虽然是胴调钓竿,但鱼太小又发挥不了鱼竿的腰力,轻轻发力就变成了飞磕,体现不出伊吹的特性。然而,尽管有这些不足,我依然享受着双飞,连竿上鱼的快感,这正是钓鱼的魅力所在。

阅读全文 »