3.相机
下来我们对相机进行调整,相机即是我们看游戏的角度。我们希望游戏角色是指哪打哪的,所以对相机的位置与角度参数进行调整。
十分应该注意的是,在选择Projection的时候,我们要根据需求进行调整:Perspective是透视视角,即我们说的近大远小;orthographic是正交视角,即无论远近都是一样大。在这里我们选择orthographic。
调整好以后我们需要camera时刻跟上我们的角色,这就需要伟大的程序员出现了!我们需要写一个程序来执行。
在Scripts-Camera中新建C# CameraFollow
public Transform target;
public float smoothing = 5f;
Vector3 offset;
这是变量声明,target是相机要追逐的对象,之后我们在Hierarchy里把他设置为Player。smoothing是相机移动的平滑程度,我们不希望相机是抖动式的追逐玩家,而是像一条绳子一样被拽过去的。所以这里把平滑程度smoothin定义为5。offset是每次的位移量。
void Start()
{
offset = transform.position - target.position;
}
在Start方法中,我们把offset初始化,定义为现在此时此刻需要进行的位移。
void FixedUpdate()
{
Vector3 targetCamPos = target.position + offset;
transform.position = Vector3.Lerp(transform.position, targetCamPos, smoothing * Time.deltaTime);
}
我们将每次camera将要移动至的位置用一个Vector3类型的targetCamPos进行存储。两个位移点之间的移动我们使用Lerp进行移动。Lerp可以在两个Vector之间以smoothing的速度进行平滑移动。同样,我们不希望他一秒内移动50次,给他乘以DeltaTime。
and its done。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
public Transform target;
public float smoothing = 5f; //相机的平滑
Vector3 offset;
void Start()
{
offset = transform.position - target.position;
}
void FixedUpdate()
{
Vector3 targetCamPos = target.position + offset;
transform.position = Vector3.Lerp(transform.position, targetCamPos, smoothing * Time.deltaTime);
}
}
最后我们要将Player拽进target里。这时注意了!之前如果没有把Player的tag设置为Player的话,依旧是找不到的。注意!
最后我们对Player的操作就差不多了,我们可以将Player存为一个预设,直接拖进Prefabs就行。
4.添加敌人
我们要开始设置一个可以干掉的对象了。
首先我们把ZomBunny这个可爱的小家伙扔进Hierarchy。在进行任何操作之前,我们希望当子弹打在它身上的时候,他最好能迸射出一点生命的火花,所以我们先在它下面增加一个粒子效果HitParticles。这个粒子效果和子对象的ZomBunny是平行的。结束了这些之后,我们将ZomBunny设置为可射击的对象,在layer中选择shootable。并改变所有子对象的赋值。
接下来,我们依次增添audio Source,RigiBody,Capsule Collider,Sphere Collider。然后接下来,我们要让这个敌人具有一定的智力,他可以神奇的越过障碍物来找到我们。这时候就需要Nav Mesh Agent。Nav Mesh Agent是一个自动寻路的组件,用途就是他可以根据我们设定的目标自动的移动避开障碍物。通常,我们要将这个agent附加在我们的角色身上,agent是一个圆柱形的结构,我们要对他设定高、直径,如果可以上楼的话还要增加Step Height。最后完成设定之后点击Bake进行烘焙操作,把这些路径烘出来。
完成这些之后,我们就要进行一些程序端的设定了。首先添加EnemyMove的脚本代码:
Transform player;
//PlayerHealth playerHealth;
//EnemyHealth enemyHealth;
UnityEngine.AI.NavMeshAgent nav;
这些是变量声明,首先定义我们的玩家定义一个Transform变量,下面的playerHealth和enemyHealth是之后阶段我们要完成的,暂且不表。接下来要定义神奇的导盲犬,我们的自动寻路的nav。
void Awake ()
{
player = GameObject.FindGameObjectWithTag ("Player").transform;
// playerHealth = player.GetComponent <PlayerHealth> ();
// enemyHealth = GetComponent <EnemyHealth> ();
nav = GetComponent <UnityEngine.AI.NavMeshAgent> ();
}
我们将player的值赋成有着Player tag的对象。同时将nav初始化。
void Update ()
{
// if(enemyHealth.currentHealth > 0 && playerHealth.currentHealth > 0)
// {
nav.SetDestination (player.position);
// }
// else
//{
// nav.enabled = false;
//}
}
暂且无需注意那些被注释掉的代码,我们设定nav去自动寻路到player。
到这里为止,我们再打开游戏就可以看到一个始终追着我们跑的小跟屁虫了。