你好,

我想让激光始终从当前位置开始,我有一個空的游戏物体在那里决定激光开始的地方,還有处理线条绘制。

这是代码:

private void UpdateLaser(bool active, Color color = default)
{
    if (laserRenderer == null) return;

    laserRenderer.enabled = active;
    if (!active) return;

    laserRenderer.startColor = color;
    laserRenderer.endColor = color;
    laserRenderer.startWidth = laserWidth;
    laserRenderer.endWidth = laserWidth;

    if (shootingPoint != null)
    {
        // 确保激光始终从射击点的位置开始
        laserRenderer.SetPosition(0, shootingPoint.position);

        Vector3 targetPos = PlayerReference.Instance.position + playerTargetOffset;
        Vector3 direction = (targetPos - shootingPoint.position).normalized;

        // 发射激光线
        RaycastHit[] hits = Physics.RaycastAll(shootingPoint.position, direction, detectionRange);
        float closestDist = detectionRange;
        Vector3 endPoint = shootingPoint.position + direction * detectionRange;

        foreach (var hit in hits)
        {
            // 忽略这次小Boss的直系碰撞
            if (hit.transform.root == transform.root) continue;

            if (hit.distance < closestDist)
            {
                closestDist = hit.distance;
                endPoint = hit.point;
            }
        }

        // 最终设置激光线的位置
        if (!active) return;
        laserRenderer.SetPosition(1, endPoint);
    }
}

private void SetupLaser()
{

    // 找到 LineRenderer 组件
    if (laserRenderer == null && shootingPoint != null)
    {
        laserRenderer = shootingPoint.GetComponent<LineRenderer>();
    }

    if (laserRenderer == null)
    {
        GameObject targetObj = (shootingPoint != null) ? shootingPoint.gameObject : gameObject;
        laserRenderer = targetObj.GetComponent<LineRenderer>();
        if (laserRenderer == null) laserRenderer = targetObj.AddComponent<LineRenderer>();
    }

    // 设置线条绘制属性
    laserRenderer.startWidth = laserWidth;
    laserRenderer.endWidth = laserWidth;
    laserRenderer.positionCount = 2;
    laserRenderer.enabled = false;
    laserRenderer.useWorldSpace = true;

    // 设置Shader
    Shader particleShader = Shader.Find("Universal Render Pipeline/Particles/Unlit");
    if (particleShader != null)
    {
        laserRenderer.material = new Material(particleShader);
    }
    else
    {
        laserRenderer.material = new Material(Shader.Find("Sprites/Default"));
    }
}