Unity实现棋盘方格

news2024/11/17 3:31:06

本文参考: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事件函数:

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

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

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

相关文章

(javaweb)事务管理+AOP

目录 1.spring事务管理 2.rollbackFor&#xff08;异常回滚属性&#xff09; 3.propagation&#xff08;事物传播行为&#xff09; AOP基础 1.AOP概述 AOP快速入门 AOP核心概念 APO进阶 1.通知类型 2.通知顺序 3.切入点表达式 4.连接点 5.AOP案例 1.spring事务管理…

谷歌浏览器翻译不了网页怎么解决

谷歌浏览器的网页翻译功能因其便捷性和高效性&#xff0c;成为了许多用户跨语言浏览的重要工具。然而&#xff0c;有时候用户可能会遇到无法使用谷歌浏览器翻译网页的情况。接下来将为大家分析为何谷歌浏览器翻译不了网页以及解决方法&#xff0c;希望对你有所帮助。&#xff0…

从dxf文件中提取spline曲线

1.使用的工具 libDxf-负责解析dxf文件&#xff0c;提取图形元素 open_Nurbs-负责spline曲线的计算 2.效果如下 左图是CAD绘制的spline曲线&#xff0c;右图是程序中显示的曲线&#xff0c;红色点是在CAD中作图时鼠标点击的拟合点。 3.main.cpp代码 #include"zmDXF.h&…

【香橙派系列教程】(十五) VSCode SSH远程连接开发板,以香橙派为例

【十五】VSCode远程连接香橙派 文章目录 【十五】VSCode远程连接香橙派第一步&#xff1a;安装vscode第二步&#xff1a;安装Remote Development第三步&#xff1a;字体设置第四步&#xff1a;配置远程连接第五步&#xff1a;配置远程目录 第一步&#xff1a;安装vscode 之前发…

SuperMap WebGPA外部大数据集群部署实践

SuperMap WebGPA外部大数据集群部署实践 特别说明&#xff1a;部署前准备&#xff1a; 1.安装包说明2. 许可配置3. 机器情况部署过程说明&#xff1a; 1.设置ip主机名映射&#xff08;主机ip需要固定ip&#xff09;2. 查看防火强状态&#xff0c;关闭防火墙3. 新建用户&#…

dll修复工具下载:dll文件丢失问题?一键解决系统难题!

dll修复工具是Windows电脑必不可少的一款系统修复软件 电脑的使用频率很高&#xff0c;不可避免的会遇到丢失dll文件的情况。因此&#xff0c;dll修复工具也是能够解决的dll文件缺失的方法之一。那么如何使用dll修复工具解决缺失dll文件问题呢&#xff1f;本文将为您详细介绍电…

基于单片机的一氧化碳报警系统的设计与实现

摘 要&#xff1a; 一氧化碳对人体有害&#xff0c;尤其超标时会影响人们的健康 。 因此文章设计了一款基于单片机的一氧化氮报警器设计。 论文通过传感器检测一氧化碳浓度&#xff0c;经过 AD 转换&#xff0c;再把检测信号传递给单片机&#xff0c;经过分析处理&#xff0c…

graphRAG原理解析——基于微软graphRAG+Neo4j llm-graph-builder

知识图谱生成 llm-graph-builder&#xff08;以下简称 LGB&#xff09;也使用了最新的 graph RAG 的思路&#xff0c;使用知识图谱来加持RAG&#xff0c;提供更加准确和丰富的知识问答。知识图谱的生成上&#xff0c;利用大模型的泛化能力来自动生成和构建知识图谱&#xff0…

企事业单位数据资料防外泄如何实现?这5个小技巧等你来掌握!

企事业单位的数据资料防外泄是一项重要的任务&#xff0c;它关乎企业的核心竞争力和信息安全。 以下是五个实用的小技巧&#xff0c;可以帮助企事业单位有效地防止数据外泄&#xff1a; 1. 数据加密 技巧说明&#xff1a;通过对敏感数据进行加密处理&#xff0c;即使数据被非…

Python的10个构建桌面应用的技巧

Python以其简洁的语法和强大的库支持&#xff0c;成为开发桌面应用的热门选择。无论是创建简单的工具还是复杂的图形界面程序&#xff0c;Python都能大显身手。下面&#xff0c;我们将通过10个实用技巧&#xff0c;逐步引导你进入Python桌面应用开发的世界。 如果你对Python感兴…

服务器内存占用陡增,部分应用程序无故被停,docker-cache罪魁祸首

一、背景 告警提示&#xff1a;服务器内存占用陡增&#xff0c;部分应用程序无故被停。 查看内存占用&#xff0c;发现只剩下几百M了。 [rootnb003 ~]# free -htotal used free shared buff/cache available Mem: 30G 28G …

初识 Go 语言,环境配置有问题

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。个人知乎 Go 也称 Golang&#xff0c; 是由 Google 开发的一种开源的、静态类型、编译型、并发型&#xff0c;并具有垃圾回收功能的编程语言。它以其简洁的语法、强大的标准库和高效的并发模型而广受欢迎。今…

C++学习笔记——保留3位小数的浮点数

一、题目描述 二、代码 #include <iostream> #include <iomanip> using namespace std; int main() {double a;cin >> a;cout << fixed << setprecision(3)<<a<<endl;return 0; }

无人机遥控器显示屏的重要性!!!

无人机遥控器的显示屏在无人机操作中扮演着至关重要的角色&#xff0c;它提供了无人机状态、飞行参数、设置选项以及实时图像&#xff08;对于带屏遥控器&#xff09;等重要信息 显示飞行参数&#xff1a; 显示屏上可以实时显示无人机的高度、距离、坐标、速度、方向等关键飞行…

Buildroot构建Qt根文件系统-思维导图-学习笔记-基于正点原子阿尔法开发板

Buildroot构建Qt根文件系统 获取 Buildroot 源码 Buildroot 源码下载地址&#xff0c;https://buildroot.org/ 本次下载的是长期支持版本 移动至ubuntu后解压 tar xf buildroot-2022.02.3.tar.gz 解压后的 Buildroot 源码 配置 Buildroot 安装显示图形菜单需要的库 sudo…

Linux中库的概念,动态库,静态库

1.什么是库 库在Linux中是一个二进制文件&#xff0c;它是由.cpp文件&#xff08;不包含卖弄函数&#xff09;编译而来&#xff0c;其他程序如果想要使用该源文件中的函数时&#xff0c;只需在编译生成可执行程序时&#xff0c;链接上该源文件生成的库文件即可。库中存储的是二…

【香橙派系列教程】(十六) 语音模块与阿里云结合

【十六】语音模块与阿里云结合 本小节实现功能使用语音模块和摄像头在香橙派上做垃圾智能分类识别。 大致流程&#xff1a;说出“识别垃圾类型”口令&#xff0c;语音模块接收到之后通过串口发送字符串指令&#xff0c;随后进行拍照&#xff08;请确保香橙派已经驱动起来了摄…

2024/8/25 Nacos本机配置

目录 一、nacos下载 二、修改配置文件 2.1、配置数据库 2.2、配置鉴定密钥 2.3、配置启动脚本 三、nacos启动 3.1、启动运行脚本 3.2、新增配置 3.3、服务列表 记录一下本机nacos2.2.3配置全过程 一、nacos下载 下载地址&#xff1a;https://github.com/alibaba/nacos/r…

安灯系统赋能照明行业打造高效智能的生产管理体系

在当今竞争激烈的照明行业中&#xff0c;提高生产效率、确保产品质量以及实现智能化管理已成为企业生存和发展的关键。安灯系统作为一种先进的生产管理工具&#xff0c;正逐渐在照明行业中发挥着重要作用&#xff0c;为企业打造高效智能的生产管理体系提供有力支持。 一、照明行…

LeetCode31

206.反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#…