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. 检查容器和预制体的缩放
- 确保
textContainer的transform.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




