其实跑酷游戏的场景都是由一段一段不同的路径连接而成。为了保证地图的多样性,游戏每段路径都保证了不同,但是保证多个地路段模型的两端都是能够两两连接。这样的话,其实整个游戏实时存在的只有三个路段:1.Player正在运动的路段、2.Player运动的上一个路段、3.Player下一个即将进入的路段。之所以要保证多个路段是因为保证在跑酷中Cmaera在合理的角度可能会有前一段或者后一段路径的视野,我们要保证给玩家的是地图一直存在的效果而不是临时产生。所以我们应该保留三个路段( 这个数值不唯一,因为我们尽可能让一段路径的长度保证足够长。 )
实现: 一个RoadManage脚本,一个Road脚本。前者处理路径的生成和销毁。后者处理Road和Player的数据关系,触发前者的生成、销毁函数。
RoadManage脚本应当挂在Camera、Light等物体上, 每个路径Prefab都是绑定Road脚本。这个脚本能够实时获得Player的位置和自身位置关系。如果当Player刚刚进入RoadA.那么RoadA就通知RoadManage生成一个路径。并销毁自身。大题实现过程就是这样.下面给出样例代码:[源自:siki的逃离地球]
using UnityEngine;
using System.Collections;
public class Road: MonoBehaviour
{
private Transform player;
void Awake()
{
player = GameObject.FindGameObjectWithTag("Player").transform;
}
void Update()
{
if (player.position.z > transform.position.z + 100)
RoadManage._instance.GenerateRoad();
Destroy(this.gameObject);
}
}
using UnityEngine;
using System.Collections;
public class RoadManage : MonoBehaviour
{
public Road road1;
public Road road2; //这里保留了两个路径
public int roadCount = 2; //生成的第几个路径用于确定位置
public GameObject[] roads; //供随机生成的不同路径Prefabs;
public static RoadManage _instance;
void Awake()
{
_instance = this;
}
public void GenerateRoad()
{
roadCount++;
int type = Random.Range(0, roads.Length);
GameObject newRoad = Instantiate(roads[type], new Vector3(0, 0, roadCount * 3000), Quaternion.identity) as GameObject;
road1 = road2;
road2 = newRoad.GetComponent<Road>();
}
}
PS: 在地图生成和销毁中如果用对象池优化。
配置多张地图,每张地图遵循入口和出口位置一致即可,这样每张地图看上去就如上图一样可以前后无缝拼接,这样玩家看见的就是无尽关卡。