首页 > 其他分享 >15. 创建卡牌布局

15. 创建卡牌布局

时间:2024-03-05 12:45:41浏览次数:26  
标签:位置 15 创建 float 张卡牌 卡牌 numberOfCards public

在项目中添加 CardLayoutManager

代码如下

using System.Collections.Generic;
using UnityEngine;

public class CardLayoutManager : MonoBehaviour
{
    public bool isHorizontal;
    // 摄像机的大小是6,分辨率是1920x1080,也就是说摄像机可以看到(-10.7,-6)~(10.7,6)的物体,这里让手牌的位置从-3.5~3.5
    public float maxWidth = 7f;
    // 卡牌与卡牌之间最大的间隔是2
    public float cardSpacing = 2f;
    // 中心点位置,表示卡牌在屏幕中的位置
    public Vector3 centerPoint;

    [SerializeField]
    private List<Vector3> cardPositions = new List<Vector3>();
    private List<Quaternion> cardRotations = new List<Quaternion>();

    /// <summary>
    /// 当一共有 totalCards 张卡牌的时候,计算出第 index 张卡牌的坐标和旋转
    /// </summary>
    /// <param name="index"></param>
    /// <param name="totalCards"></param>
    /// <returns></returns>
    public CardTransform GetCardTransform(int index, int totalCards)
    {
        CalculatePositoin(totalCards, isHorizontal);

        return new CardTransform(cardPositions[index], cardRotations[index]);
    }

    /// <summary>
    /// 计算卡牌的位置
    /// </summary>
    /// <param name="numberOfCards">当前有多少张卡牌</param>
    /// <param name="horizontal">横向还是扇形</param>
    private void CalculatePositoin(int numberOfCards, bool horizontal)
    {
        // 首先要清理一下之前算好的位置
        cardPositions.Clear();
        cardRotations.Clear();

        if (horizontal)
        {
            // 卡牌是横向排列的

            // 一共有 numberOfCards 张卡牌,卡牌与卡牌之间的间距是 cardSpacing,那么它们之间的总间距是 currentWidth
            float currentWidth = cardSpacing * (numberOfCards - 1);
            // 如果卡牌太多超过 maxWidth 的话,就需要将最大宽度设置为 maxWidth
            float totalWidth = Mathf.Min(currentWidth, maxWidth);

            // 算出当前卡牌与卡牌之间的间距
            float currentSpacing = totalWidth > 0 ? totalWidth / (numberOfCards - 1) : 0;
            for (int i = 0; i < numberOfCards; i++) 
            {
                // 让卡牌从最左边以此排过来
                float xPos = 0 - totalWidth / 2 + currentSpacing * i;

                var pos = new Vector3(xPos, centerPoint.y, 0);
                var rotation = Quaternion.identity;

                // 然后记录它们的位置和旋转
                cardPositions.Add(pos);
                cardRotations.Add(rotation);
            }
        }
    }
}

其中使用CardTransform来存储卡牌的位置和旋转

抽卡并调整位置

从牌堆中抽取一张卡牌之后,需要调整它们的位置

最终效果

抽一张牌之后变成

项目相关代码

代码仓库:https://gitee.com/nbda1121440/DreamOfTheKingdom.git

标签:20240305_1211

标签:位置,15,创建,float,张卡牌,卡牌,numberOfCards,public
From: https://www.cnblogs.com/hellozjf/p/18053756

相关文章

  • SSM创建配置测试超级无敌详细版本
    1.创建2.配置tomcat3.创建webappstep01,war包step02创建web.xml<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-......
  • 15_依赖注入和控制反转
    依赖注入和控制反转在.NET中,依赖注入(DI)是一种技术,用于实现控制反转(IoC),它允许将类的依赖关系通过构造函数、方法或属性来注入。这样可以提高代码的模块化和可测试性。IServiceCollection是一个服务集合,用于注册应用程序中的服务和组件。这些服务之后可以通过IServic......
  • docker swarm集群创建
    dockerswarm集群创建sudodockerswarminit--advertise-addr127.0.0.1控制台展示Swarminitialized:currentnode(kgjpg7onmysbxvkufdc2l25xy)isnowamanager.Toaddaworkertothisswarm,runthefollowingcommand:dockerswarmjoin--tokenSWMTKN-1......
  • p7915-solution
    P7915Solutionlink考虑枚举第一个操作选L还是R。这样原序列就被分为了两个栈,用四个指针\(p1,p2,p3,p4\)分别指向这两个栈的栈顶栈底。感性理解一下,某一个栈的栈顶\(x\)可以被pop当且仅当某一个栈的栈底等于\(x\)。于是直接dfs,每次优先选L,同时确定第\(2n-i+1\)......
  • pycharm命令行进行创建虚拟环境
    安装两个模块,命令如下:pip3installvirtualenvpip3installvirtualenvwrapper-win配置环境变量选择我的电脑=>右键:选择属性=>高级系统设置=>环境变量=>系统变量=>点击新建=>填入变量名与值变量名:WORKON_HOME变量值:自定义存放虚拟环境的绝对路径WORK......
  • Codeforces edu 156 C题
    https://codeforces.com/contest/1886/problem/C思路这道题的核心问题是:给你一个字符串s,你要删除k个字母,你要找出删除k个字母后字典序最小的s。为了使字典序最小,我们就应该把字符串删成递增的样子stringtmp="";//tmp用来存删完后的字符串s+='$';//s的末尾加一个比'......
  • codeblocks两种创建文件的方式(含调试教程)
    codeblock用法以及调试教程codeblock两种创建文件的方式:1.直接建一个空白文件这种方式创建新文件的缺点是不能调试,debug是灰色的不能点第二种创建文件的方式:新建一个项目project创建一个空项目同样新建一个空白文件,只不过这种方法会提示你是否要把这个文件放在项目里先......
  • Bean创建的生命周期
    Bean创建的生命周期((20231222181259-yw9e73s'Spring的三级缓存机制:'))User.class->无参构造器->user对象(属性无赋值)->DI(依赖注入),这里通常使用@Autowired为属性赋值->初始化前(PostConstruct)->初始化(InitializingBean)->初始化后(AOP)->代理对象->userB......
  • 奥特曼净资产破20亿美元;苹果计划通过线上渠道发布 2024 款 iPad 和 Mac丨 RTE 开发者
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • 使用 Java 在Excel中创建下拉列表
    下拉列表(下拉框)可以确保用户仅从预先给定的选项中进行选择,这样不仅能减少数据输入错误,还能节省时间提高效率。在MSExcel中,我们可以通过“数据验证”提供的选项来创建下拉列表,但如果要在Java程序中通过代码实现这一功能,可能需要借助一些第三方库。本文将分享两种使用免费Java库......