Unity之使用ScrollView制作自动排列节点功能配合对象池生成的节点UI出现排列问题

一、问题展示

1.1效果展示

运行后修改分辨率再次生成出现问题,按钮Prefab的Scale大小被修改

1.2场景布局

画布Cavas设置

使用Scroll View组件 Grid Layout Group和Content Size Fitter组件实现场景布局,类似背包系统

 1.3代码思路

单击按钮从对象池中获取预设体(对象池功能:有预设体返回第一个子物体,没有创建一个预设体),将获取的预设体放入容器中

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;

public class Test : MonoBehaviour
{
    public Button creatBtn; //创建预设体按钮

    public Transform btnPrefab; //预设体
    public Transform prefabPool; //预设体对象池

    public Transform content; //存放预设体容器

    void Start()
    {
        creatBtn.onClick.AddListener(delegate
        {
            //单击后生成prefab
            Transform obj = CreratBtnPrefab();

            //修改父物体
            obj.SetParent(content);
        }
        );
    }

    //从对象池获取预设
    Transform CreratBtnPrefab() 
    {
        Transform obj;

        if (prefabPool.childCount>0)
        {
            //对象池有 获取
            obj = content.GetChild(0);
        }
        else
        {
            //对象池没有 生成预设到容器
            obj = Instantiate(btnPrefab, prefabPool);
        }

        obj.gameObject.SetActive(true); //物体显示
        return obj;
    }
}

二、错误原因

导致错误的原因很简单,我的预设体是UI(2D的)但是我的pool对象池是3D的,当我创建预设到对象池(3D)然后修改父物体到容器(2D)中就会发生问题。很简单的原因 但是在做的时候场景东西太多没有注意这个问题。记录一下,以防其他小伙伴犯这种低级问题

 三、解决办法

其实办法很简单 让对象池和容器在同一维度就可以了。但是我当时没有往这个方面想,一直认为是屏幕分辨率或者创建有问题所以在测试的时候找到两种解决办法

1.Instantiate创建时,直接创建到对应容器中,这个就是创建到同一维度

2.修改节点父物体时,修改Scale大小为1(这里我发现他不同维度修改Scale的值导致的,所以直接修改回来就好了)

最好最省事的办法 还是将容器和对象池创建同一维度的好,希望大家下次不要在踩坑了。。。 

猜你喜欢

转载自blog.csdn.net/qq_42345116/article/details/122316104