Unity实战 RTS3D即时战略游戏开发(二):玩家状态显示

发表于2017-06-02
评论0 1.9k浏览

       这是RTS3D即时战略游戏开发系列的第二篇文章,关于如何添加突出显示玩家的状态显示,下面我们来完成以下功能:导航网格的设置、摄像机的操控、以及制作单位预设。

       在 游戏中,我们需要限制玩家的可到达区域,不能到山上或水里移动,这个功能我们可以采用导航就可以完成。在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


  Unity实战RTS3D即时战略游戏开发系列:

  Unity实战 RTS3D即时战略游戏开发(一):场景

  Unity实战 RTS3D即时战略游戏开发(三):单位选中处理

  Unity实战 RTS3D即时战略游戏开发(四):鼠标管理器

  Unity实战 RTS3D即时战略游戏开发(五):NavigationMesh自动寻路

  Unity实战 RTS3D即时战略游戏开发(六):信息显示

  Unity实战 RTS3D即时战略游戏开发(七):HUD的使用小地图显示

  Unity实战 RTS3D即时战略游戏开发(八):HUD的使用单位信息显示

  Unity实战 RTS3D即时战略游戏开发(九):行为管理器Action的使用

  Unity实战 RTS3D即时战略游戏开发(十):可建造地点标示

  Unity实战 RTS3D即时战略游戏开发(十一)AiController

  Unity实战 RTS3D即时战略游戏开发(十二):建造AI、生产AI

  Unity实战 RTS3D即时战略游戏开发(十三):战斗AI的控制

  Unity实战 RTS3D即时战略游戏开发(十四)伤害更新信息显示、销毁单位、爆炸效果

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引