Unity实战 RTS3D即时战略游戏开发(三)

     大家好,我是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);
	}
}

最后把脚本拖拽到Quad上,并在检视面板上把Rotate中的Rotation值设置一下


好了,这一章的内容就到这里了.项目源码:链接:http://pan.baidu.com/s/1kV4ot6Z 密码:15ug

,欢迎大家加入QQ群:280993838  或者关注我的公众号

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值