unity简单数字拼图小游戏(源码)

news2025/6/7 15:04:19

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;

public class DragImage : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    public float stepDistance = 10f; // 设置单步间隔长度

    private bool isDragging;// 是否正在拖动
    private RectTransform rectTransform;// 当前组件的 RectTransform
    private RectTransform parentRectTransform;// 父组件的 RectTransform
    private Vector2 accumulatedDelta; // 累积的偏移量
    private Vector2 lastPosition;// 上次记录的位置


    private void Awake()
    {
        // 获取当前组件的 RectTransform
        rectTransform = GetComponent<RectTransform>();
        // 获取父组件的 RectTransform
        parentRectTransform = transform.parent as RectTransform;
    }



    void Update()
    {
        // 如果正在拖动
        if (isDragging)
        {
            // 获取鼠标滚轮输入
            float scroll = Input.GetAxis("Mouse ScrollWheel");

            if (scroll != 0)
            {
                // 根据滚轮方向计算旋转角度
                float rotation = Mathf.Sign(scroll) * 90f;
                // 对父组件执行旋转操作
                parentRectTransform.Rotate(Vector3.forward, rotation);
            }
            // 如果点击了鼠标右键
            if (Input.GetMouseButtonDown(1))
            {
                // 对父组件执行翻转操作
                parentRectTransform.localScale = new Vector3(-1f * parentRectTransform.localScale.x, 1f,1f);
            }
        }
    }
    //事件回调
    public void OnBeginDrag(PointerEventData eventData)
    {
        // 标记开始拖动
        isDragging = true;
        // 将父组件置于同级别组件的最前显示
        parentRectTransform.SetAsLastSibling();
        // 重置累积的偏移量
        accumulatedDelta = Vector2.zero;
        // 记录开始拖动的初始位置
        //lastPosition = eventData.position;

    }

    public void OnDrag(PointerEventData eventData)
    {
        // 根据拖动的偏移量移动父组件的位置
        parentRectTransform.anchoredPosition += eventData.delta;


       /* Vector2 delta = eventData.position - lastPosition;
        accumulatedDelta += delta;
        //print($"eventData.position:{eventData.position},delta:{delta},accumulatedDelta:{accumulatedDelta}");

        if (Mathf.Abs(accumulatedDelta.x) >= stepDistance)
        {
            float sign = Mathf.Sign(accumulatedDelta.x);//(new Vector2(1, 0) * accumulatedDelta.x).normalized.x;//获取方向,并且需要让取值在1或者-1这两个数
            float moveValue = accumulatedDelta.x - (Mathf.Abs(accumulatedDelta.x) % stepDistance) * sign;
            print("moveValueX:" + moveValue);
            parentRectTransform.anchoredPosition += new Vector2(moveValue, 0);
            accumulatedDelta = new Vector2(accumulatedDelta.x - moveValue, accumulatedDelta.y);

            lastPosition = new Vector2(lastPosition.x + moveValue, lastPosition.y);
        }
        if (Mathf.Abs(accumulatedDelta.y) >= stepDistance)
        {
            float sign = Mathf.Sign(accumulatedDelta.y);
            float moveValue = accumulatedDelta.y - (Mathf.Abs(accumulatedDelta.y) % stepDistance) * sign;
            parentRectTransform.anchoredPosition += new Vector2(0, moveValue);
            accumulatedDelta = new Vector2(accumulatedDelta.x, accumulatedDelta.y - moveValue);

            lastPosition = new Vector2(lastPosition.x, lastPosition.y + moveValue);
            print("moveValueY:" + moveValue);
        }*/

    }

    public void OnEndDrag(PointerEventData eventData)
    {
        isDragging = false;// 标记结束拖动

        //manager.OnEndDrag(this);
    }

    public void Close(){
        Application.Quit();// 关闭应用程序
        SceneManager.LoadScene("Suntail Village");
    }
}

优化:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;

public class DragImage : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
    public float stepDistance = 10f; // 设置单步间隔长度

    private bool isDragging;// 是否正在拖动
    private RectTransform rectTransform;// 当前组件的 RectTransform
    private RectTransform parentRectTransform;// 父组件的 RectTransform
    private Vector2 accumulatedDelta; // 累积的偏移量
    private Vector2 lastPosition;// 上次记录的位置


    private void Awake()
    {
        // 获取当前组件的 RectTransform
        rectTransform = GetComponent<RectTransform>();
        // 获取父组件的 RectTransform
        parentRectTransform = transform.parent as RectTransform;
    }



    void Update()
    {
        // 如果正在拖动
        if (isDragging)
        {
            // 获取鼠标滚轮输入
            float scroll = Input.GetAxis("Mouse ScrollWheel");

            if (scroll != 0)
            {
                // 根据滚轮方向计算旋转角度
                float rotation = Mathf.Sign(scroll) * 90f;
                // 对父组件执行旋转操作
                parentRectTransform.Rotate(Vector3.forward, rotation);
            }
            // 如果点击了鼠标右键
            if (Input.GetMouseButtonDown(1))
            {
                // 对父组件执行翻转操作
                parentRectTransform.localScale = new Vector3(-1f * parentRectTransform.localScale.x, 1f,1f);
            }
        }
    }
    //事件回调
    public void OnBeginDrag(PointerEventData eventData)
    {
        // 标记开始拖动
        isDragging = true;
        // 将父组件置于同级别组件的最前显示
        parentRectTransform.SetAsLastSibling();
        // 重置累积的偏移量
        accumulatedDelta = Vector2.zero;
        // 记录开始拖动的初始位置
        //lastPosition = eventData.position;

    }

    public void OnDrag(PointerEventData eventData)
    {
        // 根据拖动的偏移量移动父组件的位置
       // parentRectTransform.anchoredPosition += eventData.delta;


       Vector2 delta = eventData.position - lastPosition;
        accumulatedDelta += delta;
        //print($"eventData.position:{eventData.position},delta:{delta},accumulatedDelta:{accumulatedDelta}");

        if (Mathf.Abs(accumulatedDelta.x) >= stepDistance)
        {
            float sign = Mathf.Sign(accumulatedDelta.x);//(new Vector2(1, 0) * accumulatedDelta.x).normalized.x;//获取方向,并且需要让取值在1或者-1这两个数
            float moveValue = accumulatedDelta.x - (Mathf.Abs(accumulatedDelta.x) % stepDistance) * sign;
            print("moveValueX:" + moveValue);
            parentRectTransform.anchoredPosition += new Vector2(moveValue, 0);
            accumulatedDelta = new Vector2(accumulatedDelta.x - moveValue, accumulatedDelta.y);

            lastPosition = new Vector2(lastPosition.x + moveValue, lastPosition.y);
        }
        if (Mathf.Abs(accumulatedDelta.y) >= stepDistance)
        {
            float sign = Mathf.Sign(accumulatedDelta.y);
            float moveValue = accumulatedDelta.y - (Mathf.Abs(accumulatedDelta.y) % stepDistance) * sign;
            parentRectTransform.anchoredPosition += new Vector2(0, moveValue);
            accumulatedDelta = new Vector2(accumulatedDelta.x, accumulatedDelta.y - moveValue);

            lastPosition = new Vector2(lastPosition.x, lastPosition.y + moveValue);
            print("moveValueY:" + moveValue);
        }

    }

    public void OnEndDrag(PointerEventData eventData)
    {
        isDragging = false;// 标记结束拖动

        //manager.OnEndDrag(this);
    }

    public void Close(){
        Application.Quit();// 关闭应用程序
        SceneManager.LoadScene("Suntail Village");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1825096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1_常见指令【Linux中常见30个指令的学习和使用】【万字长文】

常见指令以及权限理解 开始学习linux前的注意事项 在学习linux之前&#xff0c;我们要知道linux是一个操作系统。 那操作系统是什么呢&#xff1f;&#xff08;这里只做大概了解&#xff09; 操作系统就是一个管理软硬件的软件。 它对上提供良好&#xff08;稳定、高效、安…

大模型Prompt-Tuning技术入门

Prompt-Tuning方法 1 NLP任务四种范式 目前学术界一般将NLP任务的发展分为四个阶段&#xff0c;即NLP四范式&#xff1a; 第一范式&#xff1a;基于「传统机器学习模型」的范式&#xff0c;如TF-IDF特征朴素贝叶斯等机器算法&#xff1b;第二范式&#xff1a;基于「深度学习模…

Echarts图表: 矩形树图都有哪些配置项,一文告诉你

Hello&#xff0c;本期和大家分享矩形树图的配置项&#xff0c;欢迎评论区和贝格前端工场互动交流。 一、矩形树图是什么 矩形树图是ECharts中的一种图表类型&#xff0c;用于展示树形结构的数据。矩形树图通过矩形的大小和位置来表示树形结构中节点的层次关系和数据的大小。…

C端设计师去做B端界面设计易犯哪些?要不要给他提个醒。

2024-03-29 17:03大美B端工场 很多C端设计师初涉B端设计&#xff0c;思路转变不过来&#xff0c;还用C端思想指导B端设计&#xff0c;结果就是总感觉不舒服&#xff0c;大美B端工场&#xff0c;为大家详细解读一下。 当C端设计师去设计B端界面时&#xff0c;可能会经常犯以下…

【Spine学习08】之短飘,人物头发动效制作思路

上一节说完了跑步的&#xff0c; 这节说头发发型。 基础过程总结&#xff1a; 1.创建骨骼&#xff08;头发需要在上方加一个总骨骼&#xff09; 2.创建网格&#xff08;并绑定黄线&#xff09; 3.绑定权重&#xff08;发根位置的顶点赋予更多总骨骼的权重&#xff09; 4.切换到…

使用星鸾云GPU云服务器搭配Jupyter Lab,创建个人AI大模型

最近我们公司IT部门宣布了一个大事情&#xff0c;他们开发了一款内部用的大模型&#xff0c;叫作一号AI员工&#xff08;其实就是一个聊天机器人&#xff09;&#xff0c;这个一号员工可以回答所有关于公司财务、人事、制度、产品方面的问题。 我问了句&#xff1a;公司加班有…

【服务器硬件由 CPU、RAM、硬盘等组成,选购时需考虑应用需求、预算等。散热、安全、监控与维护亦重要,未来发展趋势包括高性能、低能耗和智能化。】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

蚁剑webshell实验

GitHub - AntSwordProject/AwesomeScript: AntSword Shell 脚本分享/示例 命令行和文件管理 https 基本上请求一次响应一次就断开。

Opencv数一数有多少个水晶贴纸?

1.目标-数出有多少个贴纸 好久没更新博客了&#xff0c;最近家里小朋友在一张A3纸上贴了很多水晶贴纸&#xff0c;要让我帮他数有多少个&#xff0c;看上去有点多&#xff0c;贴的也比较随意&#xff0c;于是想着使用Opencv来识别一下有多少个。 原图如下&#xff1a; 代码…

如何应对pcdn的流量攻击?

面对PCDN的流量攻击&#xff0c;可以采取以下措施来应对&#xff1a; 一&#xff0e;配置防火墙&#xff1a; 1.禁止未授权的PCDN域名访问&#xff1a;根据网络需求&#xff0c;配置防火墙规则&#xff0c;只允许特定的PCDN域名进行访问&#xff0c;从而防止未经授权的PCDN节…

这份简历让一位程序员在谷歌获得30万美元

大家好&#xff0c;我是弗雷。每次都在让大家尝试走出职场&#xff0c;但今天我们却选择再次走进职场。 作为曾经的职场人&#xff0c;我深深明白简历的敲门砖作用&#xff0c;制作一份优质的简历至关重要。 你所见过的最优秀的简历是什么样子&#xff1f; 或者你想象中最优秀…

十大成长型思维:定位思维、商业思维、时间管理思维、学习成长思维、精力管理思维、逻辑表达思维、聚焦思维、金字塔原理、目标思维、反思思维

一、定位思维 定位思维是一种在商业和管理领域中至关重要的思维模式&#xff0c;它涉及到如何在顾客心智中确立品牌的独特位置&#xff0c;并使其与竞争对手区分开来。以下是关于定位思维的清晰介绍&#xff1a; 1、定义 定位思维是一种从潜在顾客的心理认知出发&#xff0c;通…

TrueNAS系统在ARM平台上的移植

随着家庭及中小型企业对存储和共享需求的日益增长&#xff0c;高效、可靠的文件存储系统成为支撑各类应用的关键。 在众多存储系统中&#xff0c;TrueNAS以其卓越的数据完整性与可靠性、简洁高效的应用程序部署和管理、灵活的虚拟化应用添加能力&#xff0c;以及出色的可用性&a…

汽车IVI中控开发入门及进阶(二十六):视频解码芯片ADV7180

前言: ADV7180芯片的功能框图如下: ADV7180自动检测并将兼容全球NTSC、PAL和SECAM标准的标准模拟基带电视信号转换为兼容8位ITU-R BT.656接口标准的4:2:2分量视频数据。 ADV7180芯片介绍: 简单的数字输出接口与各种MPEG编码器、编解码器、移动视频处理器以及Analog Devic…

Stable Diffusion 3 Medium 模型

开源SD3&#xff0c;中型版本&#xff0c;20亿参数&#xff0c;Stable Diffusion 3 Medium&#xff0c;系统内存要求32G&#xff0c;显卡6G。 a female character with long, flowing hair that appears to be made of ethereal, swirling patterns resembling the Northern Li…

嵌入式操作系统_3.操作系统内核架构

内核是操作系统的核心部分&#xff0c;它管理着系统的各种资源。内核可以看成连接应用程序和硬件的一座桥梁&#xff0c;是直接运行在硬件上的最基础的软件实体。目前从内核架构来划分&#xff0c;可分为宏内核&#xff08;Monolithic Kernel&#xff09;和微内核&#xff08;M…

AI图书下载:《ChatGPT打造赚钱机器》

这本书《ChatGPT打造赚钱机器》&#xff08;ChatGPT Money Machine 2024 The Ultimate Chatbot Cheat Sheet&#xff09;是一本全面的指南&#xff0c;旨在帮助读者快速掌握如何利用ChatGPT等人工智能技术创造收益。 以下是各章节内容的总结&#xff1a; **引言** 介绍了人工智…

问题(05)elementui 输入框里面禁止浏览器自动填充用户名密码、弹出浏览器历史密码提示框

问题描述 el-input&#xff0c;非密码框&#xff0c;在输入时&#xff0c; 问题1&#xff1a; 浏览器自动填充用户名密码。问题2&#xff1a;右边显示浏览器历史密码提示框。 问题解决 问题1&#xff1a;使用auto-complete"new-password" <input type"te…

【git】 OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

修改/etc/hosts文件&#xff0c;删掉以下 192.30.253.113 github.com 192.30.253.113 github.com 192.30.253.118 gist.github.com 192.30.253.119 gist.github.com #172.24.132.179 gerrit.sdp.nd 140.82.112.25 alive.github.com 140.82.114.6 api.github.com 185.199.110.15…

【CS.AL】算法核心之贪心算法:从入门到进阶

文章目录 1. 概述2. 适用场景3. 设计步骤4. 优缺点5. 典型应用6. 题目和代码示例6.1 简单题目&#xff1a;找零问题6.2 中等题目&#xff1a;区间调度问题6.3 困难题目&#xff1a;分数背包问题 7. 题目和思路表格8. 总结References 1000.1.CS.AL.1.4-核心-GreedyAlgorithm-Cre…