Unity实现棋盘方格

2024-08-26 23:36
文章标签 实现 unity 棋盘 方格

本文主要是介绍Unity实现棋盘方格,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文参考:p1_哔哩哔哩_bilibili 

一、精要提炼

1、Button自带的白色底图是圆角的,Image组件自带的白色底图是方角的。

2、2D中Instantiate指定的位置为屏幕坐标系的位置,左下角为(0,0)

3、求某个组件的位置:xx.transform.position,xx为GameObject对象

4、求某个组件的width:xx.getComponent<RectTransform>().rect.width

5、设置某个组件的大小:xx.getComponent<RectTransform>().sizeDelta = new Vector2(yy, zz);

二、通过预设体创建第一个方格

效果如图:

1、设置Game屏幕分辨率为2000*3200,大致相当于一般收集的分辨率

2、创建Canvas, 命名为BoardCanvas,其参数配置如下:

3、在Canvas下创建一个Panel,命名为BoardPanel,其大小自动为Scratch填充整个Canvas

4、在Panel下创建Image,命名为Background,其参数为:

大小:1700*1700

5、在Panel下再创建一个Button作为棋盘的方格,命名为BlockButton,其下有Text和Image组件。

Button的大小:200*200

Button自带白色底图是圆角的,我们希望Button的白色底图是方角的,需要需要再添加如上所示的Image组件,其自带的白色底图是方格的。

6、在Assets下创建Prefab目录,将BlockButton放置其中。我们希望通过代码生成一个个的方格。

7、创建一个Empty物体命名为GameManager

8、创建一个C#脚本命名为BoardGameManager,并挂载到GameManager下:

public class BoardGameManager : MonoBehaviour
{[SerializeField]private GameObject blockButton;[SerializeField]private GameObject panel;private void Awake(){Instantiate(blockButton, new Vector3(0,0,0), Quaternion.identity, panel.transform);}
}

然后配置两个GameObject的信息如下:

执行代码后效果如下:

方格出现在Canvas的左下角,而不是我们想要的Panel的中间位置。

这是因为Instantiate中执行的(0,0,0)是屏幕坐标系的位置,位于屏幕的左下角,如果需要转化为Canvas中的中间位置,则需要加上canvas的坐标位置。代码修改如下:

public class BoardGameManager : MonoBehaviour
{[SerializeField]private GameObject blockButton;[SerializeField]private GameObject panel;[SerializeField]private GameObject boardCanvas;private void Awake(){GameObject button = Instantiate(blockButton, new Vector3(0,0,0), Quaternion.identity, panel.transform);button.transform.position += boardCanvas.transform.position;}
}

三、创建任意个数的方格

已知Panel中心点的局部位置为(0,0),即最外层正中心的位置。

方格分别标记为(m,n),此为序号信息,非坐标值信息。第一个为(0,0),第二个为(0,1),依次进行标记。如下图所示:

已知最外层正方形的边长为len1,空隙的长度为len2,方格的个数为count。

根据正中心的坐标值,可以求得最左上角的坐标值,进而求得每个方格中心点的坐标值。首先count为单数/双数分别推导公式,然后就会发现count单数/双数共用同一个公式。此处省略计算过程,只在代码中给出最终的结果公式。

BoardGameManager.cs完整的代码如下:

public class BoardGameManager : MonoBehaviour
{[SerializeField] private GameObject blockButton;[SerializeField] private GameObject background;[SerializeField] private GameObject panel;[SerializeField] private GameObject boardCanvas;public int count;private void Awake(){float totalLen = background.GetComponent<RectTransform>().rect.width;float gapLen = 10;if(count == 0){count = 8;}renderBoard(totalLen, gapLen, count);}/*** totalLen: background总长度* gapLen: 方格间空隙长度* count: 方格个数*/private void renderBoard(float totalLen, float gapLen, int count){float buttonLen = 1f * (totalLen - count * gapLen - gapLen) / count;for (int i = 0; i < count; i++){for (int j = 0; j < count; j++) {float poxX = 1f / 2 * (2 * i + 1 - count) * (totalLen - gapLen) / count;float poxY = 1f / 2 * (2 * j + 1 - count) * (totalLen - gapLen) / count;    Debug.Log(poxX + " " + poxY);GameObject button = Instantiate(blockButton, new Vector3(poxX, poxY, 0), Quaternion.identity, panel.transform);button.transform.position += boardCanvas.transform.position;button.GetComponent<RectTransform>().sizeDelta = new Vector2 (buttonLen, buttonLen);}}}
}

四、点击方格显示信息

首先,创建BoardButton的C#脚本,将button的属性信息存放在该类中。

public class BoardButton : MonoBehaviour
{private int posX;private int posY;public void setPos(int posX, int posY) { this.posX = posX;       this.posY = posY;}public void onClickButton(){Debug.Log(this.posX + ", " + this.posY);    }
}

然后,修改BoardGameManager.cs代码,增加记录pos的信息:

public class BoardGameManager : MonoBehaviour
{[SerializeField] private GameObject blockButton;[SerializeField] private GameObject background;[SerializeField] private GameObject panel;[SerializeField] private GameObject boardCanvas;public int count;private void Awake(){float totalLen = background.GetComponent<RectTransform>().rect.width;float gapLen = 10;if(count == 0){count = 8;}renderBoard(totalLen, gapLen, count);}/*** totalLen: background总长度* gapLen: 方格间空隙长度* count: 方格个数*/private void renderBoard(float totalLen, float gapLen, int count){float buttonLen = 1f * (totalLen - count * gapLen - gapLen) / count;for (int i = 0; i < count; i++){for (int j = 0; j < count; j++) {float poxX = 1f / 2 * (2 * i + 1 - count) * (totalLen - gapLen) / count;float poxY = 1f / 2 * (2 * j + 1 - count) * (totalLen - gapLen) / count;    Debug.Log(poxX + " " + poxY);GameObject button = Instantiate(blockButton, new Vector3(poxX, poxY, 0), Quaternion.identity, panel.transform);button.transform.position += boardCanvas.transform.position;button.GetComponent<RectTransform>().sizeDelta = new Vector2 (buttonLen, buttonLen);button.GetComponent<BoardButton>().setPos(i, j);}}}
}

最后,在BoardButton组件中配置OnClick事件函数:

此时运行程序,点击任何一个方格都会打印位置信息。

这篇关于Unity实现棋盘方格的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110005

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja