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

代码:

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.mfbz.cn/a/710941.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

B端颜值无所谓?麻痹自己可以,麻痹业务人员和客户试一试。

很多老铁觉得B端系统颜值和体验无所谓&#xff0c;功能好就行了&#xff0c;我不认同这种说法&#xff0c;我觉得优秀的B端系统应该是内外兼修的&#xff0c;而不是偏科的。你想一想你费尽研发的系统&#xff0c;就是因为颜值问题&#xff0c;你的业务人员没信息推销&#xff0…

光学雨量监测站:科技赋能,精准监测降水过程

TH-YJ3随着科技的不断进步&#xff0c;光学雨量监测站作为一种先进的降水监测设备&#xff0c;正逐渐在气象、水文、农业等领域发挥重要作用。光学雨量监测站以其高精度、高可靠性、实时性强的特点&#xff0c;为降水数据的收集和分析提供了强有力的支持&#xff0c;为相关领域…

【github】项目的代码仓库重命名

问题 有时候&#xff0c;我们先创建了远端项目仓库&#xff0c;然后就把相关code上传到远端项目仓库。 可能需要结合实际情况对远端项目仓库进行重命名。 当前仓库名称v_ttc&#xff0c;如何将他修改成v_datejs 操作步骤 1、在 GitHub.com 上&#xff0c;导航到存储库的主页…

Python酷库之旅-比翼双飞情侣库(05)

目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …

一文搞懂阻塞赋值和非阻塞赋值

目录 2.非阻塞赋值举例3.阻塞赋值举例4.总结 微信公众号获取更多FPGA相关源码&#xff1a; # 1.阻塞赋值和非阻塞赋值的区别&#xff1a; (1)阻塞赋值""&#xff0c;必须是阻塞赋值完成后&#xff0c;才进行下一条语句的执行&#xff1b;赋值一旦完成&#xff0c;等号…

Ollama 本地CPU部署开源大模型

Ollama可以在本地CPU非常方便地部署许多开源的大模型。 如 Facebook的llama3, 谷歌的gemma, 微软的phi3&#xff0c;阿里的qwen2 等模型。 完整支持的模型列表可以参考&#xff1a;https://ollama.com/library 它基于llama.cpp实现&#xff0c;本地CPU推理效率非常高&#xff0…

Postman简介

目录 1.概述 2.诞生背景 3.历史版本 4.安装和卸载 5.菜单和菜单项 6.使用 7.应用场景 8.示例 8.1.简单的GET请求 8.2.POST请求提交数据 8.3.查询参数 9.未来展望 10.总结 1.概述 Postman是一款用于API开发、测试和文档管理的综合性工具。允许开发者和测试人员创建…

leetcode刷题记录42-1584. 连接所有点的最小费用

问题描述 给你一个points 数组&#xff0c;表示 2D 平面上的一些点&#xff0c;其中 points[i] [xi, yi] 。 连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 &#xff1a;|xi - xj| |yi - yj| &#xff0c;其中 |val| 表示 val 的绝对值。 请你返回将所有点连…

建议收藏 | IT运维体系合集(附PPT下载)

现如今&#xff0c;IT运维工作的重要性日益凸显。对于构建IT运维管理系统而言&#xff0c;进行系统的运维建设以确保运维服务工作正常、有序、高效、协调地进行尤为重要。 很多人对运维建设停留在传统的认知层面&#xff0c;缺乏系统的培训。因此本篇文章分享一套IT运维体系合…

LLM大语言模型算法特训,带你转型AI大语言模型算法工程师(完结)

LLM大语言模型算法 与AI大语言模型算法工程师的联系 LLM&#xff08;Large Language Model&#xff09;大语言模型是指像GPT这样的大型自然语言处理模型&#xff0c;而AI大语言模型算法工程师则是负责开发和优化这些模型的专业人士。它们之间的联系可以从以下几个方面来理解&a…

MySQL概述——DDL

1.SQL通用语法 1.SQL语句可以单行或多行书写&#xff0c;以分号结尾。 2. SQL语句可以使用空格/缩进来增强语句的可读性。 3.MySQL数据库的SQL语句不区分大小写&#xff0c;关键字建议使用大写。 4.注释: &#xff08;1&#xff09;单行注释:--注释内容或#注释内容(MySQL特…

MoCo v3(ICCV 2021)

paper&#xff1a;An Empirical Study of Training Self-Supervised Vision Transformers official implementation&#xff1a;https://github.com/facebookresearch/moco-v3 出发点 本文并没有提出一种新的方法&#xff0c;而是对计算机视觉领域最近进展中的一个重要且基础…

MySQL 日志(一)

本篇主要介绍MySQL日志的相关内容。 目录 一、日志简介 常用日志 一般查询日志和慢查询日志的输出形式 日志表 二、一般查询日志 三、慢查询日志 四、错误日志 一、日志简介 常用日志 在MySQL中常用的日志主要有如下几种&#xff1a; 这些日志通常情况下都是关闭的&a…

我用AI绘画Stable Diffusion 一个月后,竟然能做出惊艳所有人的效果!

大家好&#xff0c;我是设计师阿威 如今要拍摄一组写真&#xff0c;需要服装、道具、灯光、场地、布景、拍摄、后期等过程。整个过程需要统一才能形成好的写真效果。现在有了AI绘图技术&#xff0c;我们可以实现通过AI绘图&#xff0c;只用计算机计算就得到一组接近真实的写真照…

Python 中国象棋游戏【含Python源码 MX_011期】

简介&#xff1a; 中国象棋是一种古老而深受喜爱的策略棋类游戏&#xff0c;也被称为中国的国粹之一。它在中国有着悠久的历史&#xff0c;起源可以追溯到几个世纪以前。Python 中国象棋游戏是一个用Python编程语言编写的软件程序&#xff0c;旨在模拟和提供中国象棋的游戏体验…

Github 2024-06-10开源项目周报 Top15

根据Github Trendings的统计,本周(2024-06-10统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目8Jupyter Notebook项目2Go项目2C++项目1Shell项目1Lua项目1JavaScript项目1MDX项目1C项目1HTML项目1Python - 100天从新手到大师 创建…

Maven 项目的创建(导入依赖、仓库、maven的配置、配置国内源、以及可能遇到的问题)

一、创建Maven项目 使用的编译软件&#xff1a;idea 软件版本&#xff1a; 社区版 2021.1 - 2022.4&#xff08;为什么选择这个版本&#xff0c;因为只有这个版本里有一些插件是可以安装的&#xff09; 专业版不限制&#xff08;专业版功能是最全的&#xff0c;但是收费&am…

【会议征稿,ACM出版】2024年云计算与大数据国际学术会议(ICCBD 2024,7月26-28)

2024年云计算与大数据国际学术会议(ICCBD 2024)将于2024年7月26-28日在中国大理召开。ICCBD 2024将围绕“云计算与大数据”的最新研究领域, 旨在为从事研究的专家、学者、工程师和技术人员提供一个国际平台&#xff0c;分享科研成果和尖端技术&#xff0c;了解学术发展趋势&…

能耗分析与远程抄表是什么?

一、引言 在21世纪的数字化时代&#xff0c;能耗分析和远程抄表已成为现代能源管理的重要组成部分。这两项技术不仅提高了能源效率&#xff0c;还为企业和个人提供了更精细的能源使用数据&#xff0c;从而实现更科学的节能减排。 二、能耗分析的深度洞察 能耗分析是通过收集…

Python保姆级教程 数据类型—新手小白入门必看

python学习资料&#xff0c;下方已打包好 一、基本数据类型与变量&#xff08;上&#xff09; 2.1 注释 优点&#xff1a; 代码说明 没注释的代码 有注释的代码 不让解释器执行注释的那句话 2.2 单行注释 单行注释快捷键&#xff1a;ctrl &#xff1f; 2.3多行注释 …