查看: 1543|回复: 1
打印 上一主题 下一主题

[其他] Unity无限地形实现类似跑步机效果

[复制链接]

9903

主题

126

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
53488
精华
316

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2016-3-29 21:07:47 |只看该作者 |倒序浏览
  1. using UnityEngine;
  2. using System.Collections;

  3. public class InfiniteTerrain : MonoBehaviour
  4. {
  5.     public GameObject PlayerObject;
  6.     private Terrain[,] _terrainGrid = new Terrain[3,3];

  7.     void Start ()
  8.     {
  9.         Terrain linkedTerrain = gameObject.GetComponent<Terrain>();
  10.         _terrainGrid[0,0] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();// 创建一个地形
  11.         _terrainGrid[0,1] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
  12.         _terrainGrid[0,2] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
  13.         _terrainGrid[1,0] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
  14.         _terrainGrid[1,1] = linkedTerrain;
  15.         _terrainGrid[1,2] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
  16.         _terrainGrid[2,0] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
  17.         _terrainGrid[2,1] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();
  18.         _terrainGrid[2,2] = Terrain.CreateTerrainGameObject(linkedTerrain.terrainData).GetComponent<Terrain>();

  19.         UpdateTerrainPositionsAndNeighbors();
  20.     }

  21.     private void UpdateTerrainPositionsAndNeighbors()
  22.     {
  23.         _terrainGrid[0,0].transform.position = new Vector3(
  24.             _terrainGrid[1,1].transform.position.x - _terrainGrid[1,1].terrainData.size.x,
  25.             _terrainGrid[1,1].transform.position.y,
  26.             _terrainGrid[1,1].transform.position.z + _terrainGrid[1,1].terrainData.size.z);
  27.         _terrainGrid[0,1].transform.position = new Vector3(
  28.             _terrainGrid[1,1].transform.position.x - _terrainGrid[1,1].terrainData.size.x,
  29.             _terrainGrid[1,1].transform.position.y,
  30.             _terrainGrid[1,1].transform.position.z);
  31.         _terrainGrid[0,2].transform.position = new Vector3(
  32.             _terrainGrid[1,1].transform.position.x - _terrainGrid[1,1].terrainData.size.x,
  33.             _terrainGrid[1,1].transform.position.y,
  34.             _terrainGrid[1,1].transform.position.z - _terrainGrid[1,1].terrainData.size.z);

  35.         _terrainGrid[1,0].transform.position = new Vector3(
  36.             _terrainGrid[1,1].transform.position.x,
  37.             _terrainGrid[1,1].transform.position.y,
  38.             _terrainGrid[1,1].transform.position.z + _terrainGrid[1,1].terrainData.size.z);
  39.         _terrainGrid[1,2].transform.position = new Vector3(
  40.             _terrainGrid[1,1].transform.position.x,
  41.             _terrainGrid[1,1].transform.position.y,
  42.             _terrainGrid[1,1].transform.position.z - _terrainGrid[1,1].terrainData.size.z);

  43.         _terrainGrid[2,0].transform.position = new Vector3(
  44.             _terrainGrid[1,1].transform.position.x + _terrainGrid[1,1].terrainData.size.x,
  45.             _terrainGrid[1,1].transform.position.y,
  46.             _terrainGrid[1,1].transform.position.z + _terrainGrid[1,1].terrainData.size.z);
  47.         _terrainGrid[2,1].transform.position = new Vector3(
  48.             _terrainGrid[1,1].transform.position.x + _terrainGrid[1,1].terrainData.size.x,
  49.             _terrainGrid[1,1].transform.position.y,
  50.             _terrainGrid[1,1].transform.position.z);
  51.         _terrainGrid[2,2].transform.position = new Vector3(
  52.             _terrainGrid[1,1].transform.position.x + _terrainGrid[1,1].terrainData.size.x,
  53.             _terrainGrid[1,1].transform.position.y,
  54.             _terrainGrid[1,1].transform.position.z - _terrainGrid[1,1].terrainData.size.z);

  55.         _terrainGrid[0,0].SetNeighbors(             null,              null, _terrainGrid[1,0], _terrainGrid[0,1]);
  56.         _terrainGrid[0,1].SetNeighbors(             null, _terrainGrid[0,0], _terrainGrid[1,1], _terrainGrid[0,2]);
  57.         _terrainGrid[0,2].SetNeighbors(             null, _terrainGrid[0,1], _terrainGrid[1,2],              null);
  58.         _terrainGrid[1,0].SetNeighbors(_terrainGrid[0,0],              null, _terrainGrid[2,0], _terrainGrid[1,1]);
  59.         _terrainGrid[1,1].SetNeighbors(_terrainGrid[0,1], _terrainGrid[1,0], _terrainGrid[2,1], _terrainGrid[1,2]);
  60.         _terrainGrid[1,2].SetNeighbors(_terrainGrid[0,2], _terrainGrid[1,1], _terrainGrid[2,2],              null);
  61.         _terrainGrid[2,0].SetNeighbors(_terrainGrid[1,0],              null,              null, _terrainGrid[2,1]);
  62.         _terrainGrid[2,1].SetNeighbors(_terrainGrid[1,1], _terrainGrid[2,0],              null, _terrainGrid[2,2]);
  63.         _terrainGrid[2,2].SetNeighbors(_terrainGrid[1,2], _terrainGrid[2,1],              null,              null);
  64.     }

  65.     void Update ()
  66.     {
  67.         if (Time.frameCount % 10 != 0)
  68.             return;
  69.         
  70.         Vector3 playerPosition = new Vector3(PlayerObject.transform.position.x, PlayerObject.transform.position.y, PlayerObject.transform.position.z);
  71.         Terrain playerTerrain = null;
  72.         int xOffset = 0;
  73.         int yOffset = 0;
  74.         for (int x = 0; x < 3; x++)
  75.         {
  76.             for (int y = 0; y < 3; y++)
  77.             {
  78.                 // 过滤出当前的middle索引[x,y]
  79.                 if ((playerPosition.x >= _terrainGrid[x,y].transform.position.x) &&
  80.                     (playerPosition.x <= (_terrainGrid[x,y].transform.position.x + _terrainGrid[x,y].terrainData.size.x)) &&
  81.                     (playerPosition.z >= _terrainGrid[x,y].transform.position.z) &&
  82.                     (playerPosition.z <= (_terrainGrid[x,y].transform.position.z + _terrainGrid[x,y].terrainData.size.z)))
  83.                 {
  84.                     playerTerrain = _terrainGrid[x,y];
  85.                     xOffset = 1 - x;
  86.                     yOffset = 1 - y;
  87.                     break;
  88.                 }
  89.             }
  90.             if (playerTerrain != null)
  91.                 break;
  92.         }

  93.         //  若果不等于上一次的索引[1,1]就切换索引,找出现在的middlle块
  94.         if (playerTerrain != _terrainGrid[1,1])
  95.         {
  96.             Terrain[,] newTerrainGrid = new Terrain[3,3];
  97.             for (int x = 0; x < 3; x++)
  98.                 for (int y = 0; y < 3; y++)
  99.                 {
  100.                     int newX = x + xOffset;
  101.                     if (newX < 0)
  102.                         newX = 2;
  103.                     else if (newX > 2)
  104.                         newX = 0;
  105.                     int newY = y + yOffset;
  106.                     if (newY < 0)
  107.                         newY = 2;
  108.                     else if (newY > 2)
  109.                         newY = 0;
  110.                     newTerrainGrid[newX, newY] = _terrainGrid[x,y];
  111.                 }
  112.             _terrainGrid = newTerrainGrid;
  113.             UpdateTerrainPositionsAndNeighbors();
  114.         }
  115.     }
  116. }
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

Hobir    

0

主题

9

听众

3052

积分

中级设计师

Rank: 5Rank: 5

纳金币
19
精华
0
沙发
发表于 2016-3-30 10:40:17 |只看该作者
这要看有点生涩 也不知道怎么去搭建场景 最好能给个简单的例子
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-13 21:09 , Processed in 0.095451 second(s), 28 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部