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;// 当前组件的 RectTransformprivate RectTransform parentRectTransform;// 父组件的 RectTransformprivate Vector2 accumulatedDelta; // 累积的偏移量private Vector2 lastPosition;// 上次记录的位置private void Awake(){// 获取当前组件的 RectTransformrectTransform = GetComponent<RectTransform>();// 获取父组件的 RectTransformparentRectTransform = 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;// 当前组件的 RectTransformprivate RectTransform parentRectTransform;// 父组件的 RectTransformprivate Vector2 accumulatedDelta; // 累积的偏移量private Vector2 lastPosition;// 上次记录的位置private void Awake(){// 获取当前组件的 RectTransformrectTransform = GetComponent<RectTransform>();// 获取父组件的 RectTransformparentRectTransform = 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.mzph.cn/bicheng/29657.shtml

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

相关文章

2. Revit API UI 之 IExternalCommand 和 IExternalApplication

2. Revit API UI 之 IExternalCommand 和 IExternalApplication 上一篇我们大致看了下 RevitAPI 的一级命名空间划分&#xff0c;再简单讲了一下Attributes命名空间下的3个类&#xff0c;并从一个代码样例&#xff0c;提到了Attributes和IExternalCommand &#xff0c;前者是指…

【docker 如何自定义镜像】

查看容器列表 首先是查看容器&#xff1a;在命令台中键入 docker ps -a 命令&#xff0c;得到如下界面。 从容器创建一个新镜像 接着&#xff0c;dockers commit 容器名 要保存成的镜像名&#xff1a;版本名&#xff08;若没有 &#xff1a;版本名 则直接默认为latest&#x…

【网络安全】网络安全基础精讲 - 网络安全入门第一篇

目录 一、网络安全基础 1.1网络安全定义 1.2网络系统安全 1.3网络信息安全 1.4网络安全的威胁 1.5网络安全的特征 二、入侵方式 2.1黑客 2.1.1黑客入侵方式 2.1.2系统的威胁 2.2 IP欺骗 2.2.1 TCP等IP欺骗 2.2.2 IP欺骗可行的原因 2.3 Sniffer探测 2.4端口扫描技术…

2024新版AI创作系统pro搭建,支持文生漫画视频ai对话问答/ai音乐创作/ai测评/ai换脸/ai写真

一、系统介绍 一款结合了多种功能应用&#xff0c;是当前市场最热门的AI工具综合体 AI动漫生成 AI音乐创作 AI写真 AI换脸 AI绘画 AI趣测 六大AI功能 AI创作小程序是一种利用人工智能技术为用户提供服务&#xff0c;并通过某种方式实现的小程序。这种小程序可以应用于多…

gRPC(Google Remote Procedure Call Protocol)谷歌远程过程调用协议

文章目录 1、gRPC简介2、gRPC核心的设计思路3、gPRC与protobuf关系 1、gRPC简介 gPRC是由google开源的一个高性能的RPC框架。Stubby Google内部的RPC&#xff0c;演化而来的&#xff0c;2015年正式开源。云原生时代是一个RPC标准。 2、gRPC核心的设计思路 网络通信 ---> gPR…

vue中通过自定义指令实现一个可拖拽,缩放的弹窗

效果 功能描述 按住头部可拖拽鼠标放到边框&#xff0c;可缩放多层重叠丰富的插槽&#xff0c;易于扩展 示例 指令代码 export const dragDialog {inserted: function (el, { value, minWidth 400, minHeight 200 }) {// 让弹窗居中let dialogHeight el.clientHeight ?…

Vue61-消息订阅与发布-任意组件之间的通信

一、原理图 原生的JS不能实现订阅与发布&#xff0c;要借助第三方库&#xff1a;pubsub-js&#xff08;任何一个框架都能用&#xff01;&#xff09; 二、案例实现 school组件&#xff0c;需要数据&#xff08;订阅消息&#xff09;&#xff0c;student组件提供数据&#xff0…

MySQL 高级 - 第十二章 | 数据库的设计规范

目录 第十二章 数据库的设计规范12.1 为什么需要数据库设计12.2 范式12.2.1 范式简介12.2.2 范式都包括哪些12.2.3 键和相关属性的概念12.2.4 第一范式&#xff08;1st NF&#xff09;12.2.5 第二范式&#xff08;2nd NF&#xff09;12.2.6 第三范式&#xff08;3rd NF&#xf…

onnx进阶算子优化

一、定义 如何保证pytorch 模型顺利转为onnx. 前言pytorch 算子是如何与onnx 算子对齐的&#xff1f;Asinh 算子出现于第 9 个 ONNX 算子集。PyTorch 在 9 号版本的符号表文件中是怎样支持这个算子的&#xff1f;BitShift 算子出现于第11个 ONNX 算子集。PyTorch 在 11 号版本…

4M-21:霸气侧漏高效的20+多模态AI模型

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则…

软件设计不是CRUD(22):在流式数据处理系统中进行业务抽象落地——设计思考

(接上文《软件设计不是CRUD(21):在流式数据处理系统中进行业务抽象落地——需求分析》) 那么思考到这里我们就能做一些关于设计思路的总结: 每一个独立的数据处理流,就是数据采集系统中的一个功能。这个功能具备一个静态的控制逻辑(当然控制逻辑也可以是动态的,本文不…

嵌入式技术学习——c51单片机——蜂鸣器

一、蜂鸣器介绍 蜂鸣器时一种将电信号转化成声音信号的器件&#xff0c;常用来产生设备的按键音&#xff0c;报警音等提示信号。 蜂鸣器分为有源蜂鸣器&#xff0c;无源蜂鸣器 。 有源蜂鸣器&#xff1a;内部自带震荡源&#xff0c;将正负极街上直流电压即可持续发声&#x…

深度学习(十)——神经网络:非线性激活

一、Padding Layers简介 nn.ZeroPad2d&#xff1a;在输入的tensor数据类型周围用0进行填充 nn.ConstantPad2d&#xff1a;在输入的tensor数据类型周围用常数进行填充 这个函数的主要作用是对输入的图像进行填充&#xff0c;但里面所有功能都能用nn.Conv2d实现。 二、Non-li…

一文读懂OpenGVLab带来的最新视觉预训练框架

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则…

.NET周刊【6月第3期 2024-06-18】

国内文章 记一次 .NET某游戏币自助机后端 内存暴涨分析 https://www.cnblogs.com/huangxincheng/p/18243233 文章讨论了程序中非托管内存暴涨的问题。作者描述了友人发现内存问题并请他帮助分析的背景&#xff0c;利用WinDbg工具分析Linux平台上的内存泄漏情况。文章介绍了如…

潮玩宇宙大逃杀APP系统开发成品案例分享指南

这是一款多人游戏&#xff0c;玩家需要选择一个房间躲避杀手。满足人数后&#xff0c;杀手会随机挑选一个房间杀掉里面所有的参与者&#xff0c;其他房间的幸存者将平均瓜分被杀房间的元宝。玩家在选中房间后&#xff0c;倒计时结束前可以自由切换不同房间。 软件项目开发成品…

LabVIEW开发为什么沟通需求非常重要

在LabVIEW开发项目中&#xff0c;需求沟通是项目成功的基石。以下是需求沟通的重要性及其原因&#xff1a; 明确项目目标&#xff1a; 定义清晰的目标&#xff1a;通过与用户的沟通&#xff0c;可以明确项目的目标和范围&#xff0c;确保开发团队理解用户的实际需求&#xff0c…

【Android-Compose】流式布局FlowRow 不能居中对齐的一种解决办法

问题描述&#xff1a; 在安卓Compose 开发中使用LazyColumn 流式布局 FlowRow 有时候比延迟网格布局更灵活&#xff0c;但是也可能出现自动流向下一行之后&#xff0c;末尾处留下一些小空白。如图&#xff1a; 问题解决&#xff1a; 为了尽可能居中对齐&#xff0c;我们可…

专业技能篇---计算机网络篇

文章目录 前言计算机网络基础一、网络分层模型 HTTP一、从输入URL到页面显示发生了什么&#xff1f;二、Http的状态码有哪些&#xff1f;三、 HTTP与HTTPS有什么区别&#xff1f;四、URI 和 URL 的区别是什么?五、Cookie和Session有什么区别&#xff1f;六、GET与POST 前言 主…

dmhs同步因目的端表自增列报错解决方法

dmhs同步因目的端表自增列报错解决方法 1 dmhs copy 装载数据时报错 HY000 CODE:-27232 配置源端捕获器cpt 1 dmhs copy 装载数据时报错 HY000 CODE:-2723 ERR:Only if specified in the column list and SET IDENTITY INSERT is ON, then identity column could be assigned …