大家好,我是Zander,我们接着来开发Rts3D即时战略游戏开发。上一章我们添加了突出显示玩家的状态显示,这节课我们来处理一下单位被选中或取消时的效果,通用的办法是使脚本处理每个可交互的对象,但是我们不想让上百个对象每帧检测自己是否被选中,为了提高效率,我们新建 一个交互管理器。
首先,在Scripts文件夹下新建一个Interactive脚本,接下来创建一个Interactions文件夹,并在此文件夹下创建一个Interaction脚本,并把它改成一个抽象类,我们需要很多不同的类来处理交互,这里面只需要选中和取消 两个方法 ,如图:
using UnityEngine;
using System.Collections;
public abstract class Interaction : MonoBehaviour {
public abstract void Select();
public abstract void Deselect();
}
Interactive类用于管理每个独立的对象是否被点击,它不处理鼠标点击,这是其他类负责的事情,但是他会暴露一些属性和方法,以便选中对象时别的类可以通知他,首先我要需要声明一个变量 _Selected 来判断对象是不是已经被选中,另外我们还有声明一个变量Swap,方便在编辑器中改变选中状态,另外还要声明选中和取消的方法:具体实现如下:
using UnityEngine;
using System.Collections;
public class Interactive : MonoBehaviour {
private bool _Selected = false; //对象是不是已经被选中,
public bool Selected { get { return _Selected; } }
public bool Swap = false; //方便在编辑器中改变选中状态
public void Select()
{
_Selected = true;
foreach (var selection in GetComponents<Interaction>()) {
selection.Select();
}
}
public void Deselect()
{
_Selected = false;
foreach (var selection in GetComponents<Interaction>()) {
selection.Deselect();
}
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (Swap) {
Swap = false;
if (_Selected) Deselect();
else Select ();
}
}
}
下面我们来实现一下,当选中“无人机单位”时可以高亮显示。在Scripts->Interaction文件夹下创建一个叫HighLight的脚本并编辑它,使HighLight脚本继承与Interaction而不是MonoBehaviour,并且重写父类的选中和取消的方法。在这个类中,我们要声明一个GameObject类型,它基于是否选中决定是否显示,代码如下:
using UnityEngine;
using System.Collections;
public class Highlight : Interaction {
public GameObject DisplayItem; //被选中时,需要显示的物体
public override void Deselect ()
{
DisplayItem.SetActive (false);
}
public override void Select ()
{
DisplayItem.SetActive (true);
}
// Use this for initialization
void Start () {
DisplayItem.SetActive (false);
}
}
我们找到Prefabs文件夹下的DroneUnit ,为它添加HighLight脚本 和Interactive脚本,并把DroneUnit的子物体Quad拖拽到HighLight脚本中的DisplayItem上,如图:
保存一下,我们运行RtsMap场景,通过控制Interactive的Swap变量,我们就有了一个简单的方式可以切换物体的高亮显示。
好了,这一章的内容就到这里了. 项目源码:链接:http://pan.baidu.com/s/1o8lluiQ 密码:shks
欢迎大家加入QQ群:280993838 或者关注我的公众号: