Unity跑酷游戏的无尽关卡是如何生成的?

其实跑酷游戏的场景都是由一段一段不同的路径连接而成。为了保证地图的多样性,游戏每段路径都保证了不同,但是保证多个地路段模型的两端都是能够两两连接。这样的话,其实整个游戏实时存在的只有三个路段: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();
    }
}

      PS: 在地图生成和销毁中如果用对象池优化。



配置多张地图,每张地图遵循入口和出口位置一致即可,这样每张地图看上去就如上图一样可以前后无缝拼接,这样玩家看见的就是无尽关卡。


你可能感兴趣的:(unity,面试问答)