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

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 野生西瓜

[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. 单步调试,运行时可前进回退寻路过程