You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中UI GameObject无法移动至指定位置的问题排查

问题描述

我想用脚本实现简洁的转场动画,于是创建了两个UI Image组件,目前动画功能正常,但图像始终固定在左下角。试过Unity各类移动函数(除了MoveTowards,不想用内置动画),还是没法解决。

相关代码
using System.Collections;
using UnityEditor;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class SceneController : MonoBehaviour
{
    public SceneAsset scene;

    public Sprite maskSprite;
    public Material maskMaterial;
    public Material backgroundMaterial;

    private float time;

    private void Start()
    {
        StartCoroutine("AnimationController");
    }

    private Image createMesch(string name, Material material) {
        
        GameObject child = new GameObject(name);
        child.transform.SetParent(gameObject.transform);
        Image childMaterial = child.AddComponent<Image>();
        childMaterial.material = material;

        // 从网上复制的代码,本应让锚点和枢轴居中
        childMaterial.rectTransform.anchorMin = new Vector2(0.5f, 0.5f);
        childMaterial.rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
        childMaterial.rectTransform.pivot = new Vector2(0.5f, 0.5f);

        return childMaterial;

    }

    private IEnumerator AnimationController() {
        Image mask = createMesch("Transition_Mask", backgroundMaterial);
        mask.sprite = maskSprite;
        Image background = createMesch("Transition_Background", maskMaterial);

        // 无效
        background.rectTransform.position = Vector3.zero;

        Vector2 screenSize = new Vector2(Screen.width, Screen.height);
        print(background.rectTransform.position);
        background.rectTransform.sizeDelta = screenSize;
        background.color = Color.black;

        float maskSize = Mathf.Sqrt(Mathf.Pow(Screen.width, 2) + Mathf.Pow(Screen.height, 2));
        Vector2 targetSize = new Vector2(maskSize, maskSize);

        while (time < 1)
        {
   
            mask.rectTransform.sizeDelta = Vector2.Lerp(targetSize, Vector3.zero, time);
            yield return null;
            time += Time.deltaTime / 0.8f;
        }

  
        yield return new WaitForSeconds(2);
        time = 0;
  
        while (time < 1)
        {
   
            mask.rectTransform.sizeDelta = Vector2.Lerp(Vector2.zero, targetSize, time);
            yield return null;
            time += Time.deltaTime / 0.8f;
        }

    }

    private void OnTriggerEnter(Collider other)
    {
        SceneManager.LoadScene(scene.name);
    }

}
当前显示效果

示例效果

内容的提问来源于stack exchange,提问作者Benjamin Cisek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:28:12