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

Unity主角地面标记淡出失效问题修复求助

修复方案:主角地面标记无法淡出问题

问题根源

  • 主角与自身距离恒为0:循环中处理主角时,Vector3.Distance(MainCharacter.position, AllCharacters[i].transform.position)结果永远是0,永远满足Distance ≤ VisibilityThreshold,因此一直执行FadeInMarker,永远不会触发淡出逻辑。
  • 主角对象被禁用导致逻辑中断:当触发DeactivateCharacter时,主角被SetActive(false),后续Update循环中无法正常获取主角的位置信息,标记的更新逻辑彻底失效。

修复步骤

1. 为主角标记设置独立的判断条件

如果需要主角标记根据相机距离(或其他自定义条件)淡入淡出,修改Update循环中的距离计算逻辑:

void Update()
{
    for (int i = 0; i < AllCharacters.Length; i++)
    {
        float Distance;
        // 为主角标记单独设置判断条件(示例:相机与主角的距离)
        if (AllCharacters[i] == MainCharacter.gameObject)
        {
            Distance = Vector3.Distance(Camera.main.transform.position, MainCharacter.position);
        }
        else
        {
            Distance = Vector3.Distance(MainCharacter.position, AllCharacters[i].transform.position);
        }

        if (Distance <= VisibilityThreshold)
        {
            FadeInMarker(Markers[i]);
            if (AllCharacters[i] == MainCharacter.gameObject)
            {
                characterActivationController.ActivateCharacter();
            }
        }
        else
        {
            FadeOutMarker(Markers[i]);
            if (AllCharacters[i] == MainCharacter.gameObject)
            {
                characterActivationController.DeactivateCharacter();
            }
        }

        if (Markers[i].GetComponent<SpriteRenderer>().color.a > 0f)
        {
            Markers[i].transform.position = new Vector3(AllCharacters[i].transform.position.x, AllCharacters[i].transform.position.y - 1f, AllCharacters[i].transform.position.z);
            Markers[i].transform.rotation = Quaternion.Euler(90f, 0f, 0f);
        }
    }
}

2. 修改CharacterActivationController,避免禁用主角对象

原代码中禁用主角对象会导致后续逻辑中断,改为控制主角的渲染器显示/隐藏:

public class CharacterActivationController : MonoBehaviour
{
    private Renderer[] characterRenderers;

    void Awake()
    {
        // 获取主角所有子物体的渲染组件
        characterRenderers = GetComponentsInChildren<Renderer>();
    }

    public void ActivateCharacter()
    {
        foreach (Renderer renderer in characterRenderers)
        {
            renderer.enabled = true;
        }
    }

    public void DeactivateCharacter()
    {
        foreach (Renderer renderer in characterRenderers)
        {
            renderer.enabled = false;
        }
    }
}

3. 可选:如果主角标记不需要参与距离判断

若主角标记仅需在特定场景显示,可在Start循环中跳过主角标记的创建,或在Update中直接跳过主角的处理逻辑:

// 在Start的创建标记循环中添加判断
for (int i = 0; i < AllCharacters.Length; i++)
{
    if (AllCharacters[i] == MainCharacter.gameObject)
    {
        // 跳过主角标记创建,或单独初始化
        continue;
    }
    // 其他标记创建逻辑...
}

验证修复

  • 运行游戏后,主角标记会根据相机距离(或你设置的自定义条件)触发淡入淡出
  • 主角对象不会被禁用,标记的位置更新和透明度变化逻辑持续正常执行

内容的提问来源于stack exchange,提问作者Cleiton G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:12:07