You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity 2D游戏浮动文本缩放异常求助:代码触发时文本缩放变为540无法正常显示

解决Unity浮动文本缩放异常问题

看起来你遇到的问题根源是世界空间坐标直接赋值给UI元素导致的缩放错乱,我来帮你一步步定位和解决:

问题原因分析

你的Canvas设置为Screen Space - Camera模式,这种模式下UI元素的transform.position是基于绑定相机的屏幕空间坐标(1单位对应1像素,参考分辨率1920*1080)。但你在代码中直接把宝箱的世界空间坐标(游戏世界的单位,比如1单位=1米)赋值给了文本UI的position,两者单位完全不匹配,Unity的UI系统为了适配这个错误的坐标,自动放大了文本的缩放比例,导致出现540倍的异常缩放。

而直接将预制体拖入场景时,你是把它放在Canvas的子节点下,其坐标是正确的屏幕空间坐标,所以显示正常。

解决方案

1. 添加相机引用并转换坐标

FloatingTextManager脚本中,添加对Canvas绑定相机的引用,然后将世界空间坐标转换为屏幕空间UI坐标:

修改后的FloatingTextManager脚本关键部分:

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

public class FloatingTextManager : MonoBehaviour {
    public GameObject textContainer;
    public GameObject textPrefab;
    // 添加Canvas绑定的主相机引用,在Inspector中拖入你的主相机
    public Camera uiCamera;

    private List<FloatingText> floatingTexts = new List<FloatingText>();

    // ... 其他原有代码不变 ...

    public void Show(string msg, int fontSize, Color color, Vector3 worldPosition, Vector3 motion, float duration) {
        FloatingText floatingText = GetFloatingText();
        floatingText.txt.text = msg;
        floatingText.txt.fontSize = fontSize;
        floatingText.txt.color = color;
        
        // 核心修复:将世界空间坐标转换为屏幕空间UI坐标
        Vector3 screenPosition = uiCamera.WorldToScreenPoint(worldPosition);
        // 设置z值为正数,确保文本在相机前方可见(根据你的相机近裁剪面调整,比如10)
        screenPosition.z = 10f;
        floatingText.go.transform.position = screenPosition;
        
        floatingText.motion = motion;
        floatingText.duration = duration;
        floatingText.Show();
    }

    // ... 其他原有代码不变 ...
}

2. 检查容器和预制体的缩放

  • 确保textContainertransform.localScale(1,1,1),避免子元素继承异常缩放
  • 检查你的文本预制体,确保其初始transform.localScale也是(1,1,1)

3. 验证调用逻辑

你的Chest脚本中的调用不需要修改,因为传入的gameObject.transform.position确实是正确的世界空间坐标,我们已经在Show方法中完成了转换。

为什么这样能解决?

WorldToScreenPoint方法会把游戏世界中的3D坐标转换为基于绑定相机的2D屏幕坐标,这个坐标完全适配Screen Space - Camera模式下的UI系统,Unity不会再为了适配错误坐标而自动缩放文本,从而解决了缩放异常的问题。

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

火山引擎 最新活动