您当前的位置: 首页 >  游戏
  • 5浏览

    0关注

    193博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

U3D(Unity) 实现电路解密、通水管游戏

我寄人间雪满头丶 发布时间:2019-08-16 22:16:01 ,浏览量:5

前言

游戏需要实现一个类似GTA5和蜘蛛侠游戏中的电路解密功能,记录下来以供日后复习和他人参考。

需求

在这里插入图片描述 游戏玩法是把右上角电源、右下角电源还有的游戏左下角终点连接在一起获得胜利,终点不能旋转,其他方块点击旋转90度,而且从两个电源出来的路径要高亮显示。

游戏一共有五种方块(其中十字形相当于两个一组成,不是向其他三个方向散开)。 在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

思路

这种模式诈一看有点复杂,理清了思路就好做了。我一共写了两个类实现这个功能,一个是方块类,另一个是管理类。每个方块添加一个方块类,方块类起到设置方块类型,保存方块方块朝向,点击旋转并且改变朝向调用管理类方法的作用。管理类负责实现判断逻辑和路径高亮。总体思路就是将对应的方块赋值给管理类数组,然后点击方块调用管理类的递归方法,通过当前方块的流向和方块类行判断所要执行的递归方法。

在这里插入图片描述

代码

代码写得有些杂乱,有没有隐性bug也不得而知。重要的是思路,代码只是给大家一个参考。

Square类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

//记录方块的类型
public enum SquareType
{
    Yi,
    Er,
    San,
    Si,
    Shi
}
public class Square : MonoBehaviour,IPointerClickHandler
{
    [HideInInspector]
    public int up = 0;//表示方块方向,最开始用了四个方向,其实一个就可以判断
    public SquareType type;//public方块类型,可以在外部修改

    //点击旋转90度,up方向也随之改变,并且调用管理类封装的方法
    public void OnPointerClick(PointerEventData eventData)
    {
        if(eventData.button == PointerEventData.InputButton.Left)
        {
            transform.Rotate(0, 0, -90);
            up = (up + 1) % 4;
            SquareManager.manager.StartConnect();
        }
    }
}
SquareManager类
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;

//两个目标点
public enum SquareTarget
{
    TargetPoint1,
    TargetPoint2
}
public class SquareManager : MonoBehaviour
{
    public static SquareManager manager;//单例

    //储存所有方块
    public Square[] squares1;
    public Square[] squares2;
    public Square[] squares3;
    public Square[] squares4;
    public Square[,] squares = new Square[4,4];

    Dictionary road = new Dictionary();//路径

    //数组最大维度
    private const int MAX = 3;
    private const int MIN = 0;

    private SquareTarget target ;

    //判断是否完成
    bool isChecked1, isChecked2;

    //记录Connect方法执行第一次,第一次执行不存储上一个点
    bool isFirstConnect = true;

    private void Awake()
    {
        if (manager == null)
            manager = this;
    }

    //初始化数组
    void Start()
    {
        for(int i = MIN; i             
关注
打赏
1648518768
查看更多评论
0.0518s