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

如何将Unity中TrailRenderer切换至LocalSpace(局部空间)

问题描述

我希望让TrailRenderer使用LocalSpace(局部空间),因为我在玩家的剑特效中使用了该组件,静止时效果正常,但玩家移动时,TrailRenderer会随之移动,导致轨迹形状异常。我尝试将TrailRenderer所有位置的Z轴设为0,但未能解决问题。

  • 静止时正常效果:静止时剑轨迹正常效果
  • 移动时轨迹异常效果:移动时剑轨迹异常效果

相关代码

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

public class Trail : MonoBehaviour
{
    [SerializeField]
    private Transform _trailPos;
    TrailRenderer _renderer;

    [SerializeField] 
    private Vector3[] _t;

    private void Start()
    {
        _renderer = GetComponent<TrailRenderer>();
    }

    private void LateUpdate()
    {
        transform.position = _trailPos.position;
        for (int i = 0; i < _renderer.positionCount; ++i)
        {
            Vector3[] v = new Vector3[_renderer.positionCount];
            _renderer.GetPositions(v);
            for (int j = 0; j < v.Length; ++j)
            {
                v[j] = (Vector2)v[j];
            }
            _renderer.SetPositions(v);

        }
        _t = new Vector3[_renderer.positionCount];
        _renderer.GetPositions(_t);
    }
}
解决方案

核心问题

你当前的代码在LateUpdate里同步TrailRenderer物体的位置到剑的位置,但TrailRenderer设为LocalSpace时,轨迹点基于自身局部坐标系。移动整个TrailRenderer物体时,已记录的轨迹点会跟着偏移,导致轨迹变形。

解决方法

方法一:直接挂载到剑的物体上(推荐)

这是最简单的方案:

  1. 将TrailRenderer组件直接挂载到_trailPos所在的剑物体(或其子物体)上。
  2. 在Inspector面板中,将TrailRenderer的Space属性设置为Local。
  3. 删除你当前的Trail脚本,不需要额外代码控制位置,TrailRenderer会自动基于剑的局部空间生成轨迹,玩家移动时轨迹不会变形。

方法二:保留独立物体的修正代码

如果必须让TrailRenderer在独立物体上,替换原代码为以下逻辑:

using UnityEngine;

public class Trail : MonoBehaviour
{
    [SerializeField] private Transform _trailPos;
    private TrailRenderer _renderer;
    private Vector3 _lastSwordWorldPos;

    private void Start()
    {
        _renderer = GetComponent<TrailRenderer>();
        _renderer.space = TrailRenderSpace.Local;
        _lastSwordWorldPos = _trailPos.position;
        transform.position = _trailPos.position;
    }

    private void LateUpdate()
    {
        // 计算剑的位移量
        Vector3 swordDelta = _trailPos.position - _lastSwordWorldPos;
        // 反向移动TrailRenderer物体,抵消剑的位移,让轨迹点保持原世界位置
        transform.position -= swordDelta;
        // 更新TrailRenderer当前发射点到剑的位置
        _renderer.transform.localPosition = _trailPos.localPosition;
        // 记录当前剑的位置用于下一帧计算
        _lastSwordWorldPos = _trailPos.position;
    }
}

注意事项

  • 移除原代码中循环修改Z轴的逻辑,该操作无效且会浪费性能。
  • 2D游戏中确保所有相关物体Z轴一致,避免渲染层级问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:01:24