unity在鼠标所在的地形上挖洞
时间: 2024-03-22 16:37:03 浏览: 146
您可以使用Unity的输入系统来检测鼠标位置,并将洞的位置设置为鼠标所在的地形位置。下面是一个示例代码:
```csharp
using UnityEngine;
public class TerrainHole : MonoBehaviour
{
// 地形对象
public Terrain terrain;
// 洞的半径
public float radius;
// 洞的深度
public float depth;
void Update()
{
// 检测鼠标位置
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
// 如果鼠标位置在地形上,则在该位置创建一个洞
if (hit.collider.GetComponent<Terrain>() == terrain)
{
// 获取地形的高度图数据
TerrainData terrainData = terrain.terrainData;
float[,] heights = terrainData.GetHeights(0, 0, terrainData.heightmapResolution, terrainData.heightmapResolution);
// 将洞周围的高度设为0
int centerX = (int)(hit.point.x / terrainData.size.x * terrainData.heightmapResolution);
int centerZ = (int)(hit.point.z / terrainData.size.z * terrainData.heightmapResolution);
int radiusInPixels = (int)(radius / terrainData.size.x * terrainData.heightmapResolution);
for (int i = centerX - radiusInPixels; i < centerX + radiusInPixels; i++)
{
for (int j = centerZ - radiusInPixels; j < centerZ + radiusInPixels; j++)
{
if (i >= 0 && j >= 0 && i < terrainData.heightmapResolution && j < terrainData.heightmapResolution)
{
float distance = Vector2.Distance(new Vector2(i, j), new Vector2(centerX, centerZ));
if (distance < radiusInPixels)
{
float holeHeight = (1 - Mathf.Clamp01(distance / radiusInPixels)) * depth;
heights[i, j] = Mathf.Max(heights[i, j] - holeHeight, 0);
}
}
}
}
// 更新地形的高度图
terrainData.SetHeights(0, 0, heights);
}
}
}
}
```
这段代码将在鼠标所在的地形位置创建一个指定半径和深度的洞。要使用这个脚本,只需要将其挂载到一个游戏对象上,并将地形和其他参数设置为正确的值即可。
阅读全文