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

ops/2024/9/24 7:25:19/

问题

最近发现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/ops/4797.html

相关文章

Oracle11.2.0.1,(CVE-2012-1675)漏洞解决方案

1.进入容器停止监听 docker exec -it -u 0 oracle11g bash su - oracle lsnrctl stop listener2.找到监听配置文件位置&#xff0c;修改监听文件 echo $ORACLE_HOMEvi network/admin/listener.ora #在文件底部添加 SECURE_REGISTER_LISTENER (IPC) #启动监听 lsnrctl start …

MySQL三大日志

错误日志&#xff08;Error Log&#xff09; 错误日志用于记录 MySQL 服务器启动、运行以及关闭过程中遇到的错误和警告信息。通常用于诊断 MySQL 服务的启动和运行问题。默认情况下&#xff0c;错误日志文件名通常是 host_name.err&#xff0c;位于数据目录中。 查询日志&am…

Electron+Vue3整合 - 开发时状态整合

说明 本文介绍一下 Electron Vue3 的整合的基本操作。实现的效果是 &#xff1a; 1、一个正常的Vue3项目&#xff1b; 2、整合加入 Electron 框架 &#xff1a;开发时 Electron 加载的是开发的vue项目&#xff1b;步骤一&#xff1a;创建vue3项目 常规操作&#xff0c;不再赘…

02 - ArcGIS For JavaScript-矢量数据的符号化处理(Symbol)

文章目录 综述Symbol的分类Point的符号化Point符号化为二维几何&#xff1a;Point位图符号化&#xff1a;Point的三维结合符号化Point 符号化为GLTF模型 PolylineSymbol-线符号化基本样式管道样式墙体样式条带样式方管样式 PolygonSymbol-面符号化水面效果拉伸效果填充效果 Mes…

为什么科拓停车选择OceanBase来构建智慧停车SaaS应用

本文来自OceanBase的客户——拓客停车的实践分享 科拓停车简介与业务背景 作为智慧停车行业的佼佼者&#xff0c;科拓停车致力于提供全方位的智慧停车解决方案。服务涵盖车场运营管理、互联网智慧停车平台以及停车场增值服务等。通过不断研发创新&#xff0c;打造出了多样化的…

sample gpt 无限长上下文

参考地址 https://aistudio.baidu.com/projectdetail/7723195 import mathimport paddle import paddle.nn as nn import paddle.nn.functional as Fclass MaskMultiHeadAttention(nn.Layer):def __init__(self, hidden_size, num_heads):super(MaskMultiHeadAttention, self…

三、CPU基础-缓存

计算机中缓存一般分为两个部分 1.内存 2.CPU Cache 一、CPU Cache分级 CPU Cache 通常分为大小不等的三级缓存&#xff0c;分别是 L1 Cache、L2 Cache 和 L3 Cache。 L1 Cache 和 L2 Cache 都是每个 CPU 核心独有的&#xff08;通常会分为「数据缓存」和「指令缓存」&#…

idea错误地commit后如何处理

如果你想使用命令行重新初始化 Git 仓库&#xff0c;可以按照以下步骤进行&#xff1a; 删除该项目的.git文件夹 打开命令行终端。 切换到项目所在的目录&#xff0c;使用 cd 命令。 在项目目录下运行以下命令来重新初始化 Git 仓库 git init这将在当前目录下创建一个新的 Git …