主要内容
Isometric,意为等角投影的。
设置正交(Orthographic)相机。
编写相机脚本。
初步了解Raycast(光线投射)。
利用Quad(平面)处理游戏场景。
Isometric,意为等角投影的。
我们在Unity中创建新的Camera时,默认创建的Camera为3D透视(perspective)相机。通俗点讲:就是物体距离观察者越远,看上去就越小,最终消失在远处的某个点,也可以称为“带消失点的3D投影”。这种投影方法虽然精确,但是计算量和开销都很大。因为在不同的z轴距离,或者距离观察点的位置不一样,物体的大小就需要调整。如果考虑到光源等因素,处理量就更大了。
而等角投影中没有消失点,观察者的目光始终是平行的,投影方向与坐标轴的角度是固定值,虽然这样看上去略有失真,但是总体来讲立体感还是很明显的,重要的是:不管你把等角投影所形成的立体图形放在屏幕上哪一个位置,看上去都是相同的。
因此我们需要使用正交(orthographic)相机。
站在观察者的角度,一个立方体最终能看到的只有三个面(top,left,forward)。如果再加个光源的话,还应该体现出颜色的明暗度差别(比如如果一个光源从盒子的右上方照过来,上方应该是最亮的,右侧其次,左侧最暗)。
设置正交(Orthographic)相机。
首先确定Player(主角)的组件Transform为初始状态。
然后在此基础上设置Camera的组件(Size可根据需要自行调整)。
设置后的游戏视图。
编写相机脚本。
使相机跟随主角平缓地移动。
using System.Collections;using System.Collections.Generic;using UnityEngine;public class CameraFollow : MonoBehaviour {public Transform target; //对主角坐标的引用public float smoothing = 5f; //给予相机跟随移动的延迟private Vector3 offset; //offset意为偏离距离private void Start(){offset = target.position - this.transform.position; //记录初始距离}private void FixedUpdate(){Vector3 targetCamPos = target.position - offset; //计算目标位置//Lerp函数使坐标移动变得平滑//默认情况下FixedUpdate每0.02秒执行一次//Lerp(,,smoothing)表示每秒移动50次,这样太快了!//所以要*Time.Deltatime,相当于乘了0.02this.transform.position = Vector3.Lerp(transform.position, targetCamPos, smoothing * Time.deltaTime); }}
初步了解Raycast(光线投射)。
我们先来看看Raycast函数的定义(/ScriptReference/Physics.Raycast.html)
Raycast函数返回一个bool值,生成的(虚拟)光线用于判断是否接触到某个碰撞体。(定义里用了intersect,中文意思为“贯穿”,但我个人比较习惯用“接触”。)
利用Quad(平面)处理游戏场景。
在Isometric Game中,我们需要安排一个Camera跟踪Player,与此同时,Raycast(光线投射)会创建一条光线由Camera射向地面。
但由于地面上包含其他的场景物体,从而产生了不同的高度,这样会影响摄像机对地面碰撞体的判断,所以我们需要添加一个Quad来辅助Camera进行判断——GameObject/ Creat/ 3D Object/ Quad
那些灰色的,明显跟场景不搭的东西正是我们刚才添加的Quad。但是我们并不需要它的显示效果,我们只需要利用它的碰撞器(即它的轮廓线)。因此我们可以将它的组件Mesh Renderer移除,只留下Mesh Collider。
移除Mesh Renderer后视图会变成这个样子。
*这里补充一下:2D Object一般用Sprite Renderer进行渲染,而3D Object使用Mesh Renderer。
最后利用Layer(层)来限制Camera所发出光线的判断对象为Quad(可以给Quad一个独立的Layer,命名为“Floor”)。
所有工作完成后主角就能在Quad所表示的地面上,在镜头下舒服地移动了。
路过的圈毛君:“那么,主角的移动和动画又要怎样实现呢?请大家期待下次的更新叭~”