当前位置: 首页 > news >正文

Unity UI 道路线跟随:让图标沿道路轨迹移动

在 Unity UI 开发中,有时需要让图标沿着一条道路轨迹移动,比如地图上的车辆行驶动画导航路径指示等。本文介绍如何基于 UI 图片中的道路线生成曲线,并使用 Slider 控制图标沿轨迹运动,适用于 UI 导航、路径跟随动画等场景


1. 功能介绍

  • 基于 UI 图片自动解析道路轨迹,生成 AnimationCurve
  • 使用 Slider 控制图标沿道路移动
  • 适用于 UI 地图、导航路径动画等

最终效果👇

2. 代码实现

2.1 解析道路轨迹,生成曲线路径

思路:

  • 读取 UI 图片 (Image) 的 Sprite,获取 Texture2D
  • 遍历像素点,找到道路轨迹的像素
  • 转换为 UI 坐标,存入 AnimationCurve,用于后续运动计算
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using Sirenix.OdinInspector;

public class PathGenerator : MonoBehaviour
{
    public Image roadImage; // 道路线 UI 图片
    public AnimationCurve pathCurve = new AnimationCurve(); // 道路路径曲线

    [Button("Generate Path")]
    public void GeneratePath()
    {
        if (roadImage == null || roadImage.sprite == null)
        {
            Debug.LogError("Road Image or Sprite is not assigned.");
            return;
        }

        Sprite sprite = roadImage.sprite;
        Texture2D texture = sprite.texture;
        Rect rect = sprite.rect;

        List<Vector2> points = new List<Vector2>();

        // 计算缩放比例
        RectTransform rectTransform = roadImage.rectTransform;
        float scaleX = rectTransform.rect.width / rect.width;
        float scaleY = rectTransform.rect.height / rect.height;

        // 提取道路轨迹上的点
        for (int x = 0; x < rect.width; x++)
        {
            for (int y = 0; y < rect.height; y++)
            {
                Color pixel = texture.GetPixel((int)rect.x + x, (int)rect.y + y);
                if (pixel.a > 0.1f) // 透明度判断,找到道路轨迹
                {
                    Vector2 point = new Vector2(
                        (x - rect.width / 2) * scaleX, // UI 坐标转换
                        (y - rect.height / 2) * scaleY
                    );
                    points.Add(point);
                    break;
                }
            }
        }

        // 生成曲线路径
        pathCurve = new AnimationCurve();
        foreach (Vector2 p in points)
        {
            pathCurve.AddKey(p.x, p.y);
        }
    }
}

生成一条与路径相同的Curve,效果如下👇

2.2 让图标沿道路轨迹移动

思路:

  • 监听 Slider 拖动事件,获取 value
  • Slider 值映射到曲线的 X 轴坐标
  • 计算对应 Y 轴坐标,更新图标位置
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;

public class FollowPath : MonoBehaviour
{
    public PathGenerator pathGenerator; // 路径生成器
    public Slider slider; // 控制 CurrentX 的 Slider

    async void Start()
    {
        if (slider != null)
        {
            slider.onValueChanged.AddListener(OnSliderValueChanged);
        }
        await UniTask.WaitForFixedUpdate();
        OnSliderValueChanged(slider.value);
    }

    void OnSliderValueChanged(float value)
    {
        if (pathGenerator == null || pathGenerator.pathCurve.length == 0 || slider == null) return;

        // 获取路径的X范围
        float minX = pathGenerator.pathCurve.keys[0].time;
        float maxX = pathGenerator.pathCurve.keys[pathGenerator.pathCurve.length - 1].time;

        // 映射 Slider 的值到 CurrentX
        float currentX = Mathf.Lerp(minX, maxX, value);

        // 获取对应的Y坐标
        float y = pathGenerator.pathCurve.Evaluate(currentX);

        // 更新 UI 位置
        RectTransform rectTransform = GetComponent<RectTransform>();
        rectTransform.anchoredPosition = new Vector2(0, y + 4);
    }
}

3. 运行效果

  1. 点击 Generate Path,从 UI 图片解析道路轨迹
  2. 拖动 Slider,图标沿道路轨迹平滑移动
  3. 可用于 UI 导航、路径动画等场景

4. 适用场景

UI 地图导航(如 GPS 轨迹动画)
车辆行驶路径(如小车沿地图行驶)
手绘路径动画(如绘制道路后小车自动行驶)

如果有更好的优化方案,欢迎讨论! 🚀


最后贴上道路线的图片:

相关文章:

  • Springboot_实战
  • 全平台搭载旭日5!科沃斯GOAT智能割草机器人全新系列正式开售
  • 前端 安全
  • OpenEuler学习笔记(三十三):在 OpenEuler 上搭建 OpenGauss 数据库环境
  • RedHat8安装postgresql15和 postgis3.4.4记录及遇到的问题总结
  • WIN服务器快捷命令大全
  • poi 将图片写入到excel文件中
  • ssm校园二手交易平台小程序
  • STM32 GPIO误触发问题全解析:从噪声干扰到电路设计优化
  • (ICLR-2025)你只采样一次:通过自协作扩散 GAN 驯服一步文本到图像合成
  • Apache服务器的基础配置(认证考试笔记)
  • React源码揭秘 | scheduler 并发更新原理
  • LaTeX-2:PPT的编制
  • Python说课内容介绍
  • 使用右侧值现象来处理一个word导入登记表的需求
  • 【认证授权FAQ】SSL/TLS证书过期导致的CLS认证失败
  • ArcGISPro 新建shp+数据结构
  • STM32 Flash详解教程文章
  • uniapp商城之首页模块
  • rancher on k3s
  • 长期对组织隐瞒真实年龄,广元市城发集团原董事韩治成被双开
  • 一周文化讲座|城市移民与数字时代的新工作
  • 体坛联播|曼联热刺会师欧联杯决赛,多哈世乒赛首日赛程出炉
  • 本科生已发14篇SCI论文被指由其教授父亲挂名,重庆大学成立工作组核实
  • “20后”比“60后”更容易遭遇极端气候事件
  • 进化版大巴黎通杀英超,那个男人后悔了吗