Unity地形关联出错的解决办法以及地形深度拷贝

devtools/2024/9/22 16:18:12/

问题

最近发现unity地形系统的一个bug,导入的场景地形数据关联错乱了,关联到别的场景的地形数据了,meta替换了也没用,不清楚它具体是怎么关联的。

看下面的案例:

可以看到正常这个场景的地形数据应该关联的是Scene_Empty_Terrain的数据,但是现在它关联到别的了。

那我们强制把正确的地形数据拖过去行不行,我们试下!

我们发现,强制拖过去会有一个警告,意思大概是地形数据和该地形的collider数据不匹配。而在Terrain的Inspector界面并没有找到任何的关联Terrain Data的地方。

 解决办法

解决方法有两个: 

切换到Debug模式,可以暴露出来Terrain Data参数,替换即可。

方法1
  • 右键这里的小箭头,切换成Debug模式
  • 我们能看到Terrain Data参数暴露出来了,将正确的Terrain Data拖过去替换即可
方法2

其实使用上面的方式已经可以解决了,第二种是想推荐下下面的地形拷贝类,本鱼蛋自己也做个备份,方便后续使用。这个地形深度拷贝也很有用,在一些场景比如想复制一份出来删除东西作为导航网格,可以这样操作。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;public class TerrainDataTransfer : EditorWindow {TerrainData terrainDataFrom;TerrainData terrainDataTo;bool isJustCopy;[MenuItem("Custom/TerrainDataTransfer")]private static void ShowWindow() {var window = GetWindow<TerrainDataTransfer>();window.titleContent = new GUIContent("TerrainDataTransfer");window.Show();}private void OnGUI() {GUILayout.Label("原始地形数据");terrainDataFrom = (TerrainData)EditorGUILayout.ObjectField(terrainDataFrom,typeof(TerrainData),true);GUILayout.Label("目标地形数据");terrainDataTo = (TerrainData)EditorGUILayout.ObjectField(terrainDataTo,typeof(TerrainData),true);isJustCopy = GUILayout.Toggle(isJustCopy,"仅复制");if(GUILayout.Button("复制terrain")){TransferData(terrainDataFrom,terrainDataTo);}}private void TransferData(TerrainData dataFrom, TerrainData dataTo){//dataTo = new TerrainData();  会导致重定向,从而找不到本尊///复制参数dataTo.heightmapResolution = dataFrom.heightmapResolution;dataTo.size = dataFrom.size;dataTo.wavingGrassAmount = dataFrom.wavingGrassAmount;dataTo.wavingGrassSpeed = dataFrom.wavingGrassSpeed;dataTo.wavingGrassStrength = dataFrom.wavingGrassStrength;dataTo.wavingGrassTint = dataFrom.wavingGrassTint;dataTo.detailPrototypes = dataFrom.detailPrototypes;dataTo.treeInstances = dataFrom.treeInstances;dataTo.treePrototypes = dataFrom.treePrototypes;dataTo.alphamapResolution = dataFrom.alphamapResolution;dataTo.baseMapResolution = dataFrom.baseMapResolution;dataTo.splatPrototypes = dataFrom.splatPrototypes;float[,] heights = dataFrom.GetHeights(0,0, dataFrom.heightmapResolution,dataFrom.heightmapResolution);dataTo.SetHeights(0,0,heights);float[,,] alphaMap = dataFrom.GetAlphamaps(0,0, dataFrom.alphamapWidth, dataFrom.alphamapHeight);dataTo.SetAlphamaps(0,0, alphaMap);///是否只是拷贝数据if(isJustCopy)return;//在场景中创建地表GameObject obj = Terrain.CreateTerrainGameObject(dataTo);obj.name = "TerrainNew";}
}
  •  将上面的脚本导入到项目中

  • 打开编辑器窗口Custom/TerrainDataTransfer

  • 选择原始地形和目标地形文件,点击复制terrain按钮,即可自动在场景中创建出地形出来

  • 如果勾选“仅复制”选项,那么只会把原始地形和目标地形数据同步一份过去

 希望能帮到大家,喜欢本文章也点个赞加个关注,谢谢,我会长期分享自己的踩坑经验。


http://www.ppmy.cn/devtools/4905.html

相关文章

设计模式知识总结

单例模式 懒汉式 线程不安全的懒汉单例 class singleton { private:singleton() {}static singleton *p; public:static singleton *instance();void st(); }; singleton *singleton::p nullptr; singleton* singleton::instance() {if (p nullptr)p new singleton();re…

【AIGC】文本与音频生成引领行业革新

AIGC技术崛起 一、AIGC技术概述二、文本生成&#xff1a;结构化与创作型并进三、实例与代码解析四、音频生成&#xff1a;语音合成技术大放异彩五、结语 在科技的浪潮中&#xff0c;人工智能与大数据的结合不断推动着时代的进步。其中&#xff0c;AIGC&#xff08;Artificial I…

Oracle imp导入数据后中文乱码

表注释和存储过程中文变成问号的问题很可能是由于字符集不匹配所导致的。在导入过程中&#xff0c;Oracle 数据库会使用数据库的默认字符集来解释文本数据。如果导入的数据中包含了其他字符集的数据&#xff0c;特别是 UTF-8 或其他非默认字符集的数据&#xff0c;那么就可能导…

【Linux】详解如何利用共享内存实现进程间通信

一、共享内存&#xff08;Shared Memory&#xff09;的认识 共享内存&#xff08;Shared Memory&#xff09;是多进程间共享的一部分物理内存。它允许多个进程访问同一块内存空间&#xff0c;从而在不同进程之间共享和传递数据。这种方式常常用于加速进程间的通信&#xff0c;因…

【leetcode面试经典150题】63. 删除链表的倒数第 N 个结点(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

小程序如何优化搜索排名,获取曝光

在移动互联网时代&#xff0c;小程序以其便捷、轻量级的特点&#xff0c;逐渐成为用户获取服务的重要渠道。然而&#xff0c;小程序数量众多&#xff0c;如何让自己的小程序在搜索中脱颖而出&#xff0c;获取更多的曝光和流量&#xff0c;成为众多开发者关注的焦点。 一、理解…

AI人工智能讲师大模型培训讲师叶梓 大语言模型(LLM)在科学文献摘要领域的应用

大语言模型&#xff08;LLM&#xff09;在科学文献摘要领域的应用是一个前沿且迅速发展的技术趋势。通过结合GitHub上yobibyte的Compressor项目&#xff0c;我们可以深入探讨这一技术方案的潜力和实现方式。 技术背景 随着科学研究的快速发展&#xff0c;每天都有大量的科学文…

Qt实现XYModem协议(八)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据&#xff0c;并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…