3D Game Creation - Isometric Game

版权声明: https://blog.csdn.net/Ha1f_Awake/article/details/83617414

主要内容


Isometric,意为角投影的

我们在Unity中创建新的Camera时,默认创建的Camera3D透视(perspective)相机。通俗点讲:就是物体距离观察者越远,看上去就越小,最终消失在远处的某个点,也可以称为“带消失点的3D投影”。这种投影方法虽然精确,但是计算量和开销都很大。因为在不同的z轴距离,或者距离观察点的位置不一样,物体的大小就需要调整。如果考虑到光源等因素,处理量就更大了。

等角投影中没有消失点,观察者的目光始终是平行的,投影方向与坐标轴的角度是固定值,虽然这样看上去略有失真,但是总体来讲立体感还是很明显的,重要的是:不管你把等角投影所形成的立体图形放在屏幕上哪一个位置,看上去都是相同的。

因此我们需要使用正交(orthographic)相机

站在观察者的角度,一个立方体最终能看到的只有三个面(top,left,forward)。如果再加个光源的话,还应该体现出颜色的明暗度差别(比如如果一个光源从盒子的右上方照过来,上方应该是最亮的,右侧其次,左侧最暗)。


设置正交(Orthographic)相机

首先确定Player(主角)组件Transform为初始状态。

然后在此基础上设置Camera的组件(Size可根据需要自行调整)。

扫描二维码关注公众号,回复: 4041537 查看本文章

设置后的游戏视图。


 

编写相机脚本。

使相机跟随主角平缓地移动。

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.02
        this.transform.position = Vector3.Lerp(transform.position, targetCamPos, smoothing * Time.deltaTime); 
    }
}

 

初步了解Raycast(光线投射)

我们先来看看Raycast函数的定义(https://docs.unity3d.com/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表示的地面上,在镜头下舒服地移动了。


路过的圈毛君:“那么,主角的移动和动画又要怎样实现呢?请大家期待下次的更新叭~”

猜你喜欢

转载自blog.csdn.net/Ha1f_Awake/article/details/83617414