大家好,我是Zander,我们接着来开发Rts3D即时战略游戏开发。上一章我们为场景添加了Manager,以及玩家初始化信息。
下面我们来完成以下功能:导航网格的设置、摄像机的操控、以及制作单位预设。
在 游戏中,我们需要限制玩家的可到达区域,不能到山上或水里移动,这个功能我们可以采用导航就可以完成。在Unity中,导航网格在地形上比较明显,它能辨识哪些路面可走,哪些不可走,AI可以利用导航进行寻路,从一个点到另外一个点,并避开障碍。下面我们在Unity中设置一下,Window-》Navigation,在Hierarchy 中选中Terrain,然后再Navigation中选中Bake选项,下面有个BakedAgentSize选项,(其实Agent就是在一个地形上行动的单位,例如玩家或者NPC,我们需要为它指定一些信息,例如宽高、爬坡的坡度),我们来设置一下BakedAgentSize的属性
设置完后,点击右下角Bake进行烘培,图中的蓝色部分就是可行走区域。
地图导航设置好了,我们现在来设置添加一个控制摄像机移动的脚本CameraCradle,并把脚本添加到MainCamera对象上,
脚本如下:
using UnityEngine;
using System.Collections;
public class CameraCradle : MonoBehaviour {
public float Speed = 20; //camera的移动速度
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.Translate (
Input.GetAxis ("Horizontal") * Speed * Time.deltaTime,
Input.GetAxis ("Vertical") * Speed * Time.deltaTime,
0);
}
}
现在我们来制作单位预设,在第一章上传的资源中Resources -》 Content1中 找到Model 和Texture ,然后把他们导入Uinty中,
把DroneUnit 托人到Hierarchy中 ,如果它的Rotation不是(0,0,0),那么把它改成(0,0,0),并且把它自带的Animator组件给删除掉,然后把Textures下的Material0 拖拽到DroneUnit单位上,在Assets 下新建一个Prefabs的文件夹,并把DroneUnit 对象拖到Prefabs文件夹下,这样DroneUnit的预设就做好了,最后在Hierarchy中把DroneUnit删除掉
然后返回的Hierarchy中,找到Manager,在RTSManager组件上,把DroneUnit分别拖到Player1 和Player2 的StartingUnits的位置
然后我们打开RTSManager脚本编写Player的初始化,为了获取全部StartingUnits,我们先取得每一个Players,因此需要双重的Foreach循环,在Start方法中:
void Start () {
Current = this;
foreach (var p in Players) {
foreach (var u in p.StartingUnits)
{
GameObject.Instantiate(u, p.Location.position, p.Location.rotation);
}
}
}
怎么表示选中一个单位呢,这里我们用一个绕它旋转的图片表示,资源可以在下载的Resources中content2中找到,我们把资源拖到项目的Textures中命名Selected,然后在Materials中新建一个材质球,并命名为Selection,并选一个新的shader ,shader-》Unlit-》Transparent,然后把Selected图片拖到新建的材质球上,这样就做好了Selection材质球
然后重新把DroneUnit预设拖到场景中,在DroneUnit下新建一个子物体Quad,并把它的Scale设为10,Rotation 设置为(-90,0,0),把Selection材质球拖拽到Quad上,这样就可以显示出来了
我们再写一个Rotate脚本,使quad能旋转起来,
using UnityEngine;
using System.Collections;
public class Rotate : MonoBehaviour {
public Vector3 Rotation = Vector3.zero;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.Rotate (Rotation * Time.deltaTime);
}
}
好了,这一章的内容就到这里了.项目源码:链接:http://pan.baidu.com/s/1kV4ot6Z 密码:15ug