美文网首页
动态设置地形2

动态设置地形2

作者: 醉酒青牛_fa4e | 来源:发表于2018-03-27 13:46 被阅读0次

    using UnityEngine;
    using System.Collections;
    public class NewBehaviourScript : MonoBehaviour
    {
    public Vector3 point;
    public Terrain TerrainS;
    public float BiSuanDaXiao = 200;
    public Projector BlobShadowProjector;
    protected int hmWidth; // heightmap width 高度图的宽度
    protected int hmHeight; // heightmap height 高度图的高度
    float[,] heightMapBackup;
    public float Hight = 1;
    public bool ISGG;
    void Start()
    {
    TerrainS = transform.GetComponent<Terrain>();
    BlobShadowProjector = GameObject.Find("Cube").GetComponent<Projector>();
    //获取高度图的宽度
    hmWidth = TerrainS.terrainData.heightmapWidth;
    //获取高度图的高度
    hmHeight = TerrainS.terrainData.heightmapHeight;
    heightMapBackup = TerrainS.terrainData.GetHeights(0, 0, hmWidth, hmHeight);
    }
    void OnGUI()
    {
    if (GUILayout.Button(ISGG.ToString())) { ISGG = !ISGG; }
    }
    void Update()
    {
    BlobShadowProjector.orthographicSize = BiSuanDaXiao - 20;
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;
    if (Physics.Raycast(ray, out hit))
    {
    point = hit.point;
    //BlobShadowProjector.transform.position = new Vector3(point.x, BlobShadowProjector.transform.position.y, point.z);
    }
    if (Input.GetMouseButton(1))
    {
    DeformTerrain(point, BiSuanDaXiao);
    }
    if (Input.GetMouseButtonDown(0))
    { ISGG = !ISGG; }
    }
    //变形的
    protected void DeformTerrain(Vector3 pos, float craterSizeInMeters)
    {
    //获得点
    Vector3 terrainPos = GetRelativeTerrainPositionFromPos(pos, TerrainS, hmWidth, hmHeight);
    //高度图的宽度采样图世界单位的地形的
    int heightMapCraterWidth = (int)(craterSizeInMeters * (hmWidth / TerrainS.terrainData.size.x));
    //高度图的长度
    int heightMapCraterLength = (int)(craterSizeInMeters * (hmHeight / TerrainS.terrainData.size.z));
    //高度图开始点X
    int heightMapStartPosX = (int)(terrainPos.x - (heightMapCraterWidth / 2)); //高度图开始点Z
    int heightMapStartPosZ = (int)(terrainPos.z - (heightMapCraterLength / 2)); //地图高度阵列
    float[,] heights = TerrainS.terrainData.GetHeights(heightMapStartPosX, heightMapStartPosZ, heightMapCraterWidth, heightMapCraterLength);
    // 圆心x
    float circlePosX;
    // 圆心y
    float circlePosY;
    //中心距
    float distanceFromCenter;
    //我们组的大小地形每个样品所需的高度
    for (int i = 0; i < heightMapCraterLength; i++) //width
    {
    for (int j = 0; j < heightMapCraterWidth; j++) //height
    {//圆判断
    circlePosX = (j - (heightMapCraterWidth / 2)) / (hmWidth / TerrainS.terrainData.size.x);
    circlePosY = (i - (heightMapCraterLength / 2)) / (hmHeight / TerrainS.terrainData.size.z);
    distanceFromCenter = Mathf.Abs(Mathf.Sqrt(circlePosX * circlePosX + circlePosY * circlePosY));
    //如果在圆内
    if (distanceFromCenter < (craterSizeInMeters / 2))
    {
    if (ISGG)
    {
    heights[i, j] = heightMapBackup[i + heightMapStartPosZ, j + heightMapStartPosX];
    }
    else
    {
    heights[i, j] = Hight;
    }
    }
    }
    }
    //修改高度
    TerrainS.terrainData.SetHeights(heightMapStartPosX, heightMapStartPosZ, heights);
    }
    //的到正确的地形位置
    protected Vector3 GetNormalizedPositionRelativeToTerrain(Vector3 pos, Terrain terrain)
    {
    Vector3 tempCoord = (pos - terrain.gameObject.transform.position);
    Vector3 coord;
    coord.x = tempCoord.x / TerrainS.terrainData.size.x;
    coord.y = tempCoord.y / TerrainS.terrainData.size.y;
    coord.z = tempCoord.z / TerrainS.terrainData.size.z;
    return coord;
    }

    //得到相对的地形位置 
    protected Vector3 GetRelativeTerrainPositionFromPos(Vector3 pos, Terrain terrain, int mapWidth, int mapHeight)
    {
        Vector3 coord = GetNormalizedPositionRelativeToTerrain(pos, terrain);
        // 获取这个游戏对象地形高度图的位置 
        return new Vector3((coord.x * mapWidth), 0, (coord.z * mapHeight));
    }
    
    void OnApplicationQuit()
    {
        //退出程序地形还原
        TerrainS.terrainData.SetHeights(0, 0, heightMapBackup);
    }
    

    }

    相关文章

      网友评论

          本文标题:动态设置地形2

          本文链接:https://www.haomeiwen.com/subject/inajcftx.html