2D猎宝行动(类扫雷小游戏)DAY 2

1.创建地图元素数组并设计元素基类

在GameManager中添加mapArray属性,是用来存储地图的二维数组类型

public BaseElement[,] mapArray; //地图的二维数组类型

并在Awake中进行初始化

 mapArray = new BaseElement[w, h];//w是宽度,h是高度

然后将创建的可操作元素放置到地图元素数组中

//创建可操作的元素并放置到地图元素数组中
mapArray[i,j] = Instantiate(baseElement, new Vector3(i, j, 0), Quaternion.identity, elementHolder).GetComponent<BaseElement>();

给BaseElement添加boxcolider 2D,然后添加几个点击方法。考虑到这个是个基类,所有都使用虚方法。

public virtual void OnMouseOver()
{

}

public virtual void OnLeftMouseButton()
{

}

public virtual void OnRightMouseButton()
{

}

public virtual void OnMiddleMouseButton()
{

}

2.分析每个元素的共有功能并完善元素基类

完善OnMouseOver方法,并添加新的方法PlayerStand()

 public virtual void OnMouseOver()
    {
        //Tip1:GetMouseButtonUp当鼠标点击后抬起才会触发,符合该游戏规则
        //Tip2:使用else if拥有优先级,先判断中键,再判断其他
        if (Input.GetMouseButtonUp(2))
        {
            OnMiddleMouseButton();
        }
        else if (Input.GetMouseButtonUp(0))
        {
            OnLeftMouseButton();
        }
        else if (Input.GetMouseButtonUp(1))
        {
            OnRightMouseButton();
        }
    }

    public virtual void PlayerStand()
    {

    }

修改UML图。

3.创建枚举类型来标识元素的状态

创建枚举类Enumeration

public enum ElementState
{
    Covered,
    Uncovered,
    Marked
}

public enum ElementType
{
    SingleCovered,
    DoubleCovered,
    CantCovered
}

public enum ElementContent
{
    Number,
    Trap,
    Tool,
    Gold,
    Enemy,
    Door,
    BigWall,
    SmallWall,
    Exit
}

在BaseElement中添加三个变量

    public ElementState elementState;
    public ElementType elementType;
    public ElementContent elementContent;

修改中键按下的判断

if (Input.GetMouseButtonUp(2) && elementState == ElementState.Uncovered)

创建三个按键的类并继承BaseElement

4.设计可以翻开一次的元素的基类

添加随机生成的方法和三个状态的方法。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SingleCoveredElement : BaseElement {

    public override void Awake()
    {
        base.Awake();//先执行基类的Awake放啊
        elementType = ElementType.SingleCovered;
        LoadSprite(GameManager._instance.coverTileSprites[Random.Range(0, GameManager._instance.coverTileSprites.Length)]);
    }

    public void UncoveredElement()
    {

    }

    public void AddFlag()
    {

    }

    public void RemoveFlag()
    {

    }
}

5.完善可以翻开一次的元素的基类设计

左键点击调用方法PlayStand(),便于后期测试。

public virtual void OnLeftMouseButton()
    {
        PlayerStand();
    }

更新翻开一次的元素的基类方法

    public override void OnRightMouseButton()
    {
        switch (elementState)
        {
            case ElementState.Covered:
                AddFlag();
                break;
            case ElementState.Uncovered:
                return;
            case ElementState.Marked:
                RemoveFlag();
                break;
        }
    }

    public void UncoveredElement()
    {
        if (elementState == ElementState.Uncovered)
            return;
        UncoverElementSingle();
        OnUnCovered();
    }
    public void AddFlag()
    {
        elementState = ElementState.Marked;
    }

    public void RemoveFlag()
    {
        elementState = ElementState.Uncovered;
    }

6.准备设计插拔旗功能

重写PlayerStand方法

public override void PlayerStand()
    {
        switch (elementState)
        {
            case ElementState.Covered:
                UncoveredElement();
                break;
            case ElementState.Uncovered:
                return;
            case ElementState.Marked:
                RemoveFlag();
                break;
        }
    }

准备旗子预制体。

7.制作插拔旗的动画

完善插旗动画和拔旗动画。

    public void AddFlag()
    {
        elementState = ElementState.Marked;
        GameObject flag = Instantiate(GameManager._instance.flagElement, transform);
        flag.name = "flagElement";
        flag.transform.DOLocalMoveY(0, 0.1f);
    }

    public void RemoveFlag()
    {
        Transform flag = transform.Find("flagElement");
        if (flag != null)
        {
            elementState = ElementState.Covered;
            flag.DOLocalMoveY(0.15f, 0.1f).onComplete += () =>
            {
                Destroy(flag.gameObject);
            };

        }

猜你喜欢

转载自blog.csdn.net/kouzhuanjing1849/article/details/82987293