惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
V
Vulnerabilities – Threatpost
Security Latest
Security Latest
AI
AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
H
Help Net Security
Attack and Defense Labs
Attack and Defense Labs
The GitHub Blog
The GitHub Blog
L
LINUX DO - 最新话题
A
Arctic Wolf
博客园_首页
S
Securelist
S
Secure Thoughts
Google DeepMind News
Google DeepMind News
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
N
Netflix TechBlog - Medium
Cyberwarzone
Cyberwarzone
小众软件
小众软件
T
Threatpost
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Blog — PlanetScale
Blog — PlanetScale
N
News and Events Feed by Topic
NISL@THU
NISL@THU
Forbes - Security
Forbes - Security
博客园 - 聂微东
F
Fortinet All Blogs
Simon Willison's Weblog
Simon Willison's Weblog
H
Heimdal Security Blog
罗磊的独立博客
S
Security @ Cisco Blogs
B
Blog
T
Troy Hunt's Blog
Engineering at Meta
Engineering at Meta
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
The Hacker News
The Hacker News
The Last Watchdog
The Last Watchdog
Hacker News - Newest:
Hacker News - Newest: "LLM"
I
Intezer
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
The Cloudflare Blog
S
Schneier on Security
月光博客
月光博客
L
LINUX DO - 热门话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org

博客园 - 野生西瓜

[Unity 杂货铺] SpriteAtlas 和 SBP 打包 [Unity 杂货铺] 游戏字体选择 [Unity 杂货铺] 游戏项目的结构规划与初始化 [Unity 杂货铺] Git 配置与实践 [Unity 杂货铺] 引擎版本的选择 [Unity] 引擎脚本相关的字符串优化 [Unity] 基础寻路算法 - 代码实践 [Unity] 资源工作流程 - AssetPostprocessor [Unity] 资源工作流程 - ScriptedImporter [Unity] 资源工作流程 - 辅助工具 [Lua游戏AI开发指南] 笔记零 - 框架搭建 [GAME] [Civilization] 文明6字体及字体大小修改 [Unity] 编辑器运行中动态编译执行C#代码 [Unity] 在软件标题栏显示工作路径 [GAMEDEV] 个人开发如何找到合适的图片素材? [施工中] 博客导航 2021 的书 [BACKUP] Visual Studio Code 配置 [theHunterCOTW] 猎人荒野的召唤-一点资料
[Unity] 基础寻路算法 - 环境搭建
野生西瓜 · 2022-05-03 · via 博客园 - 野生西瓜

本文始发于:https://www.cnblogs.com/wildmelon/p/16148560.html

一、前言

本文只记录搭建工具时碰到的一些问题,并非完善的可视化方案和可实践应用的标准算法。

如果您正在搜索相关的寻路可视化工具,可参考:

  1. https://qiao.github.io/PathFinding.js/visual/
  2. https://clementmihailescu.github.io/Pathfinding-Visualizer/

如果您正在搜索寻路算法的入门教程,可参考:

  1. https://www.redblobgames.com/pathfinding/a-star/introduction.html (☆ 推荐)

二、背景

原打算利用一些时间了解些常用的寻路算法的基本原理。

本意是使用 Tilemap 来搭建一个简单的寻路过程可视化的工具,作为算法中的路径选择,成本等内容的可视化,大概原型会像这样:
图片1

但还是碰到了不少问题:一是 Tilemap 提供的,主要还是关卡环境搭建、表现层面的内容。如果要搭载其他的 UI(数值、高亮)和每个地块的实例数据,还是得单独编写一层数据层(利用官方的 Tilemap Extra 包应该也能实现);二是相关的细节表现,起终点选择,单步前进后退等也需要不少时间优化。

这么一来,所需的开发时间成本就变高了。虽然从工具开发的角度,并不能当作麻烦的内容。但原意是学习算法原理,辅以简洁的UI表现,现在这样就有些背道而驰了。

更重要的是在学习过程中,发现了几个完善的在线寻路可视化工具(参考前言部分)。

目前则打算先搁置多余的可视化部分,仅保留对算法的验证(能跑就行),本文就纯粹记录先前开发中碰到的问题,以作备忘。

三、工具搭建

(一)图片素材

素材来自于:https://cupnooble.itch.io/sprout-lands-asset-pack/

免费版不得使用于商业项目,具体请参考遵循作者的许可协议。

(二)地砖区分

总感觉非常不优雅,不知道能不能直接在 Unity 自带的Tile编辑器里就给设置了。

using UnityEngine;
using UnityEngine.Tilemaps;
#if UNITY_EDITOR
using UnityEditor;
# endif

public class WalkableTile : Tile
{
    public WalkableTile()
    {
        flags = TileFlags.None;
    }
}

public class ImwalkableTile : Tile
{
    public ImwalkableTile()
    {
        flags = TileFlags.None;
    }

#if UNITY_EDITOR
    // 下面是添加菜单项以创建 RoadTile 资源的 helper 函数
    [MenuItem("Assets/Create/ImwalkableTile")]
    public static void CreateImwalkableTile()
    {
        string path = EditorUtility.SaveFilePanelInProject("Save ImwalkableTile", "New ImwalkableTile", "Asset", "Save ImwalkableTile", "Assets");
        if (path == "")
            return;
        AssetDatabase.CreateAsset(ScriptableObject.CreateInstance<ImwalkableTile>(), path);
    }
# endif
}

(三)地面点击

private void Update()
{
    if (!Input.GetMouseButtonDown(0)) return;
    // 鼠标点击位置 屏幕空间 -> 世界空间
    Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    // 鼠标点击位置 世界空间 -> Tilemap格子坐标
    Vector3Int cellPos = mTilemap.WorldToCell(mouseWorldPos);
    // 格子坐标超出 tilemap 物体边界
    if (!mTilemap.cellBounds.Contains(cellPos)) return;
    // 点击格子,在水和陆地互换
    TileBase tileBase = mTilemap.GetTile(cellPos);
    if (!(tileBase is WalkableTile) && !(tileBase is ImwalkableTile)) return;

    bool isWalkable = false;
    TileBase targetTile = imwalkableTile;
    if (tileBase is ImwalkableTile)
    {
        isWalkable = true;
        targetTile = walkableTile;
    }
    mTilemap.SetTile(cellPos, targetTile);
    OnTileCellClick?.Invoke(cellPos);
}

(四)屏幕适配

using UnityEngine;
public class CameraAdjust : MonoBehaviour
{
    float width = 1920; 
    float height = 1200;

    void Awake()
    {
        //屏幕适配
        float orthographicSize = this.GetComponent<Camera>().orthographicSize;
        print("aa:" + orthographicSize);
        float scale = (Screen.height / (float)Screen.width) / (height / width);
        orthographicSize *= scale;
        print("center:" + scale + "shei" + Screen.height + Screen.width);
        print("bb:" + orthographicSize);
        this.GetComponent<Camera>().orthographicSize = orthographicSize;
    }
}

(五)优先级队列

参考:https://github.com/LiuFeng1011/Test/blob/master/Assets/PriorityQueue/PriorityQueue.cs

四、待扩展的功能

  1. 自定义场景大小
  2. 随机地砖/迷宫生成
  3. 当前成本、预估成本的可视化
  4. 不同寻路算法选择
  5. 单步调试,运行时可前进回退寻路过程