Unity做一个魔方

Unity魔方拓展脚本(魔方打乱和复原功能) 接上文,因为懒得自己手动打乱魔方,所以写了一个打乱魔方的脚本,还有魔方复原方法,以下是代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class CubePlayer : MonoBehaviour { p... 阅读详情

最近项目周期变得平稳,不再像之前那么忙了,所以抽空写了个魔方小游戏,在这里跟大家分享。

游戏原理并不复杂,在场景中,我们放了27个Cube,和6个面的触发器,根据触发器的Enter检测和Exit检测,确定对应面的子物体,使得触发器底下的9个Cube能同时转动,同时,再设置X,Y,Z三个轴向的整体转动,子物体是固定的27个Cube。

有了思路以后,我们来做场景,做完场景以后,画面大概是这样:

在FrontContent及以下5个物体中,我们要挂靠BoxCollider,和Rigibody组件,如图:

接下来,我们来写脚本,因为总体逻辑并不复杂,所以主逻辑只写了了一个GameController脚本,另外还有6个触发器脚本,以下是代码:

GameController.cs

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

public class GameController : MonoBehaviour {

    public static GameController Instance;

    public enum Axis {//旋转轴
        X = 1,
        Y = 2,
        Z = 3
    }

    public enum RotateModel {//旋转模式
        Forward = 90,
        Back = -90
    }

    public enum Direction {//旋转方位
        First = -90,
        Second = -180,
        Third = 90,
        Fourth = 0
    }

    private Direction cubeDirF;//F面转向
    private Direction cubeDirB;//B面转向
    private Direction cubeDirU;//U面转向
    private Direction cubeDirD;//D面转向
    private Direction cubeDirL;//L面转向
    private Direction cubeDirR;//R面转向
    private Direction cubeDirWholeX;//整体转向
    private Direction cubeDirWholeY;
    private Direction cubeDirWholeZ;

    private const float rotateSpeed = 150f;//旋转速度

    private Quaternion targetRotationF;//旋转角度
    private Quaternion targetRotationB;
    private Quaternion targetRotationU;
    private Quaternion targetRotationD;
    private Quaternion targetRotationL;
    private Quaternion targetRotationR;
    private Quaternion targetRotationWholeX;
    private Quaternion targetRotationWholeY;
    private Quaternion targetRotationWholeZ;

    private int targetFZ = 0;//旋转轴度数
    private int targetBZ = 0;
    private int targetUY = 0;
    private int targetDY = 0;
    private int targetLX = 0;
    private int targetRX = 0;
    private int targetWholeX = 0;
    private int targetWholeY = 0;
    private int targetWholeZ = 0;

    public Button FButton;
    public Button FAntiButton;
    public Button BButton;
    public Button BAntiButton;
    public Button UButton;
    public Button UAntiButton;
    public Button DButton;
    public Button DAntiButton;
    public Button LButton;
    public Button LAntiButton;
    public Button RButton;
    public Button RAntiButton;
    public Button XButton;
    public Button XAntiButton;
    public Button YButton;
    public Button YAntiButton;
    public Button ZButton;
    public Button ZAntiButton;

    public GameObject FrontContent;//旋转父物体
    public GameObject BackContent;
    public GameObject UpContent;
    public GameObject DownContent;
    public GameObject LeftContent;
    public GameObject RightContent;
    public GameObject WholeXContent;
    public GameObject WholeYContent;
    public GameObject WholeZContent;
    private GameObject prevContent;//上一个转动的模块

    public List<GameObject> FrontObjList;//旋转面方块集合
    public List<GameObject> BackObjList;
    public List<GameObject> UpObjList;
    public List<GameObject> DownObjList;
    public List<GameObject> LeftObjList;
    public List<GameObject> RightObjList;
    public List<GameObject> WholeObjList; 

    private bool isFrontClockwise = false;//旋转判断条件
    private bool isFrontAntiClockwise = false;
    private bool isBackClockwise = false;
    private bool isBackAntiClockwise = false;
    private bool isUpClockwise = false;
    private bool isUpAntiClockwise = false;
    private bool isDownClockwise = false;
    private bool isDownAntiClockwise = false;
    private bool isLeftClockwise = false;
    private bool isLeftAntiClockwise = false;
    private bool isRightClockwise = false;
    private bool isRightAntiClockwise = false;
    private bool isXClockwise = false;
    private bool isXAntiClockwise = false;
    private bool isYClockwise = false;
    private bool isYAntiClockwise = false;
    private bool isZClockwise = false;
    private bool isZAntiClockwise = false;
    private bool isPlaying = false;//正在旋转

    void Awake()
    {
        Instance = this;
    }

    void Start () {
        FButton.onClick.AddListener(OnClickFBtn);
        FAntiButton.onClick.AddListener(OnClickFAntiBtn);
        BButton.onClick.AddListener(OnClickBBtn);
        BAntiButton.onClick.AddListener(OnClickBAntiBtn);
        UButton.onClick.AddListener(OnClickUBtn);
        UAntiButton.onClick.AddListener(OnClickUAntiBtn);
        DButton.onClick.AddListener(OnClickDBtn);
        DAntiButton.onClick.AddListener(OnClickDAntiBtn);
        LButton.onClick.AddListener(OnClickLBtn);
        LAntiButton.onClick.AddListener(OnClickLAntiBtn);
        RButton.onClick.AddListener(OnClickRBtn);
        RAntiButton.onClick.AddListener(OnClickRAntiBtn);

        XButton.onClick.AddListener(OnClickXBtn);
        XAntiButton.onClick.AddListener(OnClickXAntiBtn);
        YButton.onClick.AddListener(OnClickYBtn);
        YAntiButton.onClick.AddListener(OnClickYAntiBtn);
        ZButton.onClick.AddListener(OnClickZBtn);
        ZAntiButton.onClick.AddListener(OnClickZAntiBtn);
    }

    void Update () {
        UpdateFrontClockwise();
        UpdateFrontAntiClockwise();
        UpdateBackClockwise();
        UpdateBackAntiClosewise();
        UpdateUpClockwise();
        UpdateUpAntiClockwise();
        UpdateDownClockwise();
        UpdateDownAntiClockwise();
        UpdateLeftClockwise();
        UpdateLeftAntiClockwise();
        UpdateRightClockwise();
        UpdateRightAntiClockwise();

        UpdateXAxisClockwise();
        UpdateXAxisAntiClockwise();
        UpdateYAxisClockwise();
        UpdateYAxisAntiClockwise();
        UpdateZAxisClockwise();
        UpdateZAxisAntiClockwise();
    }

    public void OnClickFBtn()//点击F按钮
    {
        ClickBtnEvent(RotateModel.Back, Axis.Z, ref FrontContent, ref FrontObjList, ref targetFZ, ref cubeDirF, ref targetRotationF, ref isFrontClockwise);
    }

    public void OnClickFAntiBtn()//点击F'按钮
    {
        ClickBtnEvent(RotateModel.Forward, Axis.Z, ref FrontContent, ref FrontObjList, ref targetFZ, ref cubeDirF, ref targetRotationF, ref isFrontAntiClockwise);
    }

    private void UpdateFrontClockwise()//F面正向旋转
    {
        UpdateRotateZEvent(Vector3.back, cubeDirF, targetRotationF, RotateModel.Back, ref FrontContent, ref isFrontClockwise, ref isFrontAntiClockwise);
    }

    private void 
软件工程第二次作业:基于Unity的3D魔方实现 基于Unity的3D魔方实现   一、背景:     魔方,英文名为Rubik's Cube,又叫魔术方块,也称鲁比克方块。是匈牙利布达佩斯建筑学院厄尔诺·鲁比克教授在1974年发明的。三阶魔方系由富有弹性的硬塑料制成的6面正方体,共有26块小立方体。魔方在1980年代最为风靡,至今未衰。截至2009年1月,魔方在全世界售出了3亿5千多万个。面世不久后,很多类似的玩具也纷纷出现,有些出自发明 阅读详情

相关推荐

关于魔方状态检测这事?

前阵子,我用C#在Unity写了一个魔方小游戏,写到了后期我想写魔方的还原算法,但一开始就遇到难题,要想还原魔方首先就要知道魔方的状态,人是很容易识别魔方的颜色从而确定魔方的状态的,但要想机器也能看懂魔方的状态是件难事。 看了很多贴,想借鉴一下前辈们的经验,但要么对于我说来很难,比如用机器直接识别魔方的颜色,用魔方的颜色反推魔方的状态,要么只有理论,没有一个确切的实现理论依据,思来想去决定自己写。 下面由我来描述一下我原创的魔方状态表示法: 最开始时,我首先想到的是用魔方块的所处位置.........

qq_39858654的博客 2464

unity3d魔方源码

unity3d打造魔方,unity3d打造魔方,unity3d打造魔方,unity3d打造魔方

CubeWorld:Minecraft之类的Unity游戏

魔方世界 使用Unity 3D制作的类似于Minecraft的游戏演示。 有趣的是,地形生成和图块定义非常易于配置,因为它们都位于“ CubeWorld / Assets / Resources”中的XML文件中,甚至在其中定义了用于更新引擎中体素的规则。 该项目分为三个部分: CubeWorldLibrary:基本体素游戏库,使用Visual Studio 2008以纯C#制作,实现了仿真逻辑,扇区,项目,图块更新逻辑,MULTIPLAYER支持(是的,它具有非常基本的多人游戏支持:-)) CubeWorld:使用CubeWorldLibrary在Unity中制作的演示游戏 Cube

C#做的一个魔方程序

自动解魔方的源码,开发工具VS2005,花了一个星期的时间来做,可能完全求解

3d魔方游戏,unity,c#,魔方游戏

学习玩魔方时,有一个困难:当一步操作错误,可能就忘了怎么恢复到之前的状态了,所以我们需要有存档、恢复的功能才行。 镜子效果(看到背面情况)

用Unity3d做一个魔方

用Unity3d做的一个魔方demo,算是自己初学练手的作业吧。

魔方游戏源码

魔方功能源码,鼠标控制旋转,缩放视角,鼠标左键拖动转动魔方。

CRPR的三种关键影响:从SI、OCV到Min Pulse Width的时序优化实践

本文深入探讨了CRPR(时钟重汇聚悲观度消除)在芯片时序优化中的三种关键影响:信号完整性(SI)、片上变异(OCV)和最小脉宽检查。通过实际案例分析和技术细节,展示了CRPR如何有效修正时序分析中的过度保守估计,提升设计精度。文章特别强调了SI-aware CRPR的调试技巧和OCV补偿的最佳实践,为芯片设计工程师提供了宝贵的时序优化指导。

weixin_30920853的博客 379

C# 进程间 双内存共享 高帧率图像传输

演示了两个进程之间通过 双内存共享 的方式, 来实时处理图像,并以高帧率(40~60FPS)传输的基本示例。 进程间内存共享的优点:高性能、低延迟、资源效率高、简单可靠。 适用场景:实时图像处理、大数据传输、多进程协作、实时监控系统,等等。

qianqiansd 1996

OCR开发车架号识别vin码识别系统

一、vin码识别车架号识别系统简介   vin码识别车架号识别系统,结合VIN码主机厂数据库及自身多年文字识别经验,针对机动车配置参数等信息的查询及采集业务推出的一款VIN码自动识别产品。   车架号识别vin码识别,主要应用在智能手机IOS与Android两个平台中。前端扫描查询模式,无需联网,只需扫描汽车前挡风玻璃右下角的VIN玛(车架号),即可轻松识别出车辆产地、品牌、车

OCR13512721355的博客 1433

【Linux系统】Kdenlive软件多机位同音频视频同步化处理

Kdenlive简介 官网链接:https://kdenlive.org/zh/ 命令行安装: apt-get install kdenlive Kdenlive能够进行多轨道视频编辑,可以使用和调整多条音频、视频轨道。每条轨道可以按需进行单独锁定、静音。 Kdenlive多机位同音频视频同步化处理步骤 1. 新建Kdenlive文件 选择<文件>-<新建>,建立新的kdenlive文件,初始设置为<视频轨:2>,<音频轨:2>。 视.

qq_31550269的博客 1884

解决VM 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VM 的方法

在启用了Credential Guard或Device Guard的Windows 10主机上启动12.5版之前的VMware Workstation中的虚拟机时,将显示蓝色诊断屏幕(BSOD)。 会看到类似于以下内容的错误: VMware Workstation和Device / Credential Guard不兼容。禁用Device / Credential Guard后,可以运行VMwar...

Hern(宋兆恒) 39万+

Windows 镜像包大全(附百度云下载链接)

插入U盘,找到下载好的两个驱动软件,并安装,先打开驱动人生万能网卡版,安装好网卡驱动,可以接入wifi或者网线了,然后打开驱动精灵,按照提示,安装所有的驱动(中间要是让你重启,就先选择稍后再说,如果有的驱动安装好之后非要你重启,关不掉的那种,那你就重启吧),等全部安装好了,重启电脑。如果你有显卡,这里以英伟达举例,我是GTX960的,当你的驱动都安装好后,右键桌面,会出现一个英伟达控制面板。安装软碟通,下载之后,一直下一步就ok,啥也不用配置,到了最后一项点击“继续试用”即可。(下载里面的网卡版即可),

悦分享 7354

微观交通流仿真软件:SUMO (Simulation of Urban MObility)_(1).SUMO入门与基础概念

SUMO(Simulation of Urban MObility)是一个开源的微观交通流仿真软件,用于模拟城市交通系统中的各种动态行为。SUMO不仅可以模拟车辆的行驶,还可以模拟行人、自行车、公交车等交通参与者的运动。通过SUMO,研究人员和工程师可以对交通系统进行详细建模和分析,从而优化交通规划、评估交通政策和设计智能交通系统。车辆路径规划:SUMO可以模拟车辆在路网中的路径选择,包括动态路径选择和静态路径选择。交通信号控制:支持多种交通信号控制策略,包括固定时间控制、自适应控制等。多模式交通:模拟不同

kkchenjj的博客 1181

RK3568笔记六十一:MIPI摄像头应用程序编写

V4L2设备驱动框架向应用层提供了一套统一、标准的接口规范,应用程序按照该接口规范来进行应用编程,从而使用摄像头。对于摄像头设备来说,其编程模式如下所示:1.首先是打开摄像头设备;2.查询设备的属性或功能;3.设置设备的参数,譬如像素格式、帧大小、帧率;4.申请帧缓冲、内存映射;5.帧缓冲入队;6.开启视频采集;7.帧缓冲出队、对采集的数据进行处理;8.处理完后,再次将帧缓冲入队,往复;9.结束采集。

1003

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Python下载酷狗音乐歌曲
下一篇: Unity魔方拓展脚本(魔方打乱和复原功能)
OneWord233
博客等级 码龄9年 64粉丝 46原创
评论 30
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值