随机路面

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class RoadRandom : MonoBehaviour {



  public GameObject StartLand;//length = 1.6
  private float StartLandLength;

  public GameObject MidLand;//length = 3.5
  private float MidLandLength;

  public GameObject EndLand;//length = 1.86
  private float EndLandLength;

  private GameObject obj;

  //curret  car distance 距离
  private int CurDistance ;

  private int RandomDis = 35;//随机一段路的长度
  private int RemainDis = 14;//触发生成随机路段点

  private float TinyRoadDis = 3.5f;//加载每一小段的长度

  private int SumWeight;
  private List<int> WeightList;
  private List<int> TimesList;
  private int MinCliffIndex =3;
  private float alreadyDis = 0;//从加载一直到结束的计数
  private int roadType;//随机的路段类型 1,2,3,4,5,6
  private int randomNum;
  bool isCliff = false; // Cliff 悬崖
  private int StartRandomRoad = 100;//开始第一次要随机的路段点,在100米处开始随机路面 

  private int LastRoadType = 0;

  private float Land2Height = 3f;

  private float RandomRoadLength;//随机路段总长度

  private bool isRandom = false;
  //路段的Y轴偏移量
  private float YOffset = -2.402995f;

  private float EndYOffset = -0.02108514f;

  // Use this for initialization
  void Start () {
    LandParseXML.index = 0;
    RandomRoadLength = 100;

    StartLandLength = StartLand.GetComponent<Land> ().sr.GetComponent<SpriteRenderer>().bounds.size.x;
    MidLandLength = MidLand.GetComponent<Land> ().sr.GetComponent<SpriteRenderer>().bounds.size.x;
    EndLandLength = EndLand.GetComponent<Land> ().sr.GetComponent<SpriteRenderer>().bounds.size.x;

    //玩家行驶距离
    InitCurParm ();
  }

  void Update () {
    CurDistance = UserInfos.GetUserInfo ().distance;//现在是从0开始,记录车子跑的距离
    if(RandomRoadLength > 100){
      if(RandomRoadLength - CurDistance < RemainDis){
        RandomSingleLand();
      }
    }else if(CurDistance >StartRandomRoad -  RemainDis){//StartRandomRoad -  RandomDis 得到汽车行驶到一个点,然后触发随机路面
      RandomSingleLand();
    }
  }
    
  void InitCurParm (){
    WeightList = new List<int>();
    TimesList = new List<int>();
    LandEntity temp = LandParseXML.landList [LandParseXML.index];

    SumWeight = temp.weight1 + temp.weight2 + temp.weight3 + temp.weight4 + temp.weight5 + temp.weight6;
    TimesList.Add (temp.times1);
    TimesList.Add (temp.times2);
    TimesList.Add (temp.times3);
    TimesList.Add (temp.times4);
    TimesList.Add (temp.times5);
    TimesList.Add (temp.times6);

    int tempSum = temp.weight1;
    WeightList.Add (tempSum);
    WeightList.Add (tempSum += temp.weight2);
    WeightList.Add (tempSum += temp.weight3);
    WeightList.Add (tempSum += temp.weight4);
    WeightList.Add (tempSum += temp.weight5);
    WeightList.Add (tempSum += temp.weight6);
  }
    

  void RandomSingleLand(){

    if(isRandom){
      return;
    }

      isRandom = true;

    LandEntity le = LandParseXML.landList [LandParseXML.index];
    //开始随机

    while(alreadyDis <= RandomDis){ //玩家的距离减去开始的3000米之后,行驶的距离和已经创建路的2/3处对比,判断是否创建下一级路面 
      randomNum = (int)(Random.value * SumWeight);//随机一个权重值
//      Debug.Log("==========================="+randomNum);
      for(int i=0;i<WeightList.Count;i++){
        if(WeightList[i]>randomNum){//和配置表中的权重对比
          if (isCliff) {
            roadType = (int)(Random.value * MinCliffIndex) +1;
//            roadType = (int)(Random.value * MinCliffIndex);
            isCliff = false;
          } else {
            roadType = i+1;//
//            Debug.Log("==========================="+roadType);
            isCliff = (roadType >= MinCliffIndex);//判断是否为悬崖
          }
          //创建路段
          createRoad (roadType, TimesList [roadType-1]);
          LastRoadType = roadType > 3 ? 0 : roadType;
          break;
        }
      }
    }

    RandomRoadLength += alreadyDis;
    alreadyDis = 0;

    if((CurDistance += RandomDis)>le.MAXDIS){
      LandParseXML.index++;
      InitCurParm ();
    }
    isRandom = false;
  }


  bool HasDownRoad(int temp){
    return   (  temp ==1) || (temp ==3) ;
  }

  bool HasUpRoad(int temp){
    return   (  temp ==2) || (temp ==3) ;
  }
    
  bool HasCliff(int temp){
    return   temp >= 4;
  }

  void createRoad(int roadType,int times){
    //StartLand + MidLand + EndLand 根据游戏距离,切换场景类型、背景类型、路面类型

    Debug.Log("==============================================roadType:"+roadType);
    Debug.Log("==============================================times:"+times);
    //创建路面 
    switch(roadType){
    case (int)LANDTYPE.FIRST:
      AddRoadLevel1 (times);
      break;
    case (int)LANDTYPE.SECOND:
      //加载2级路面
      AddRoadLevel2 (times);
      break;
    case (int)LANDTYPE.THIRD:
      //加载3级路面
      AddRoadLevel3 (times);
      break;
    case (int)LANDTYPE.FOURTH:
    case (int)LANDTYPE.FIFTH:
    case (int)LANDTYPE.SIXTH:
      //加载6级路面
      AddRoadLevel456 (times);
      break;
    }
  }

  /// <summary>
  /// 添加一级路面
  /// </summary>EndYOffset
  /// <param name="times">Times.</param>
  void AddRoadLevel1 (int times){

    switch (LastRoadType){
    case 1:
      break;
    case 2:
      obj = (GameObject)Instantiate (EndLand, new Vector3 (RandomRoadLength + alreadyDis, Land2Height + YOffset + EndYOffset, 0), Quaternion.identity);  
      alreadyDis += EndLandLength;
      obj = (GameObject)Instantiate (StartLand, new Vector3 (RandomRoadLength + alreadyDis, YOffset, 0), Quaternion.identity);
      alreadyDis += StartLandLength;
      break;
    case 3:
      obj = (GameObject)Instantiate (EndLand, new Vector3 (RandomRoadLength + alreadyDis, Land2Height + YOffset + EndYOffset, 0), Quaternion.identity);
      break;
    default :
      obj = (GameObject)Instantiate (StartLand, new Vector3 (RandomRoadLength + alreadyDis, YOffset, 0), Quaternion.identity);
      alreadyDis += StartLandLength;
      break;
    }
    //添加路面
    for (int i = 0; i < times; i++) {
    obj = (GameObject)Instantiate (MidLand, new Vector3 (RandomRoadLength +alreadyDis , YOffset, 0), Quaternion.identity);
      alreadyDis += MidLandLength ;
    }
  }

  /// <summary>
  /// 添加二级路面
  /// </summary>
  /// <param name="roadType">Road type.</param>
  /// <param name="times">Times.</param>
  void AddRoadLevel2 (int times){
  
    switch (LastRoadType){
    case 1:
      obj = (GameObject)Instantiate (EndLand, new Vector3 (RandomRoadLength + alreadyDis, YOffset + EndYOffset, 0), Quaternion.identity);  
      alreadyDis += EndLandLength;
      obj = (GameObject)Instantiate (StartLand, new Vector3 (RandomRoadLength + alreadyDis, Land2Height + YOffset, 0), Quaternion.identity);
      alreadyDis += StartLandLength;
      break;
    case 2:
      break;
    case 3:
      obj = (GameObject)Instantiate (EndLand, new Vector3 (RandomRoadLength + alreadyDis, YOffset + EndYOffset, 0), Quaternion.identity);
      break;
    default :
      obj = (GameObject)Instantiate (StartLand, new Vector3 (RandomRoadLength + alreadyDis, Land2Height + YOffset, 0), Quaternion.identity);
      alreadyDis += StartLandLength;
      break;
    }
      
    for (int i = 0; i < times; i++) {
    obj = (GameObject)Instantiate (MidLand, new Vector3 (RandomRoadLength +alreadyDis, Land2Height + YOffset, 0), Quaternion.identity);
      alreadyDis += MidLandLength;
    }
  }

  /// <summary>
  /// 添加三级路面
  /// </summary>
  /// <param name="roadType">Road type.</param>
  /// <param name="times">Times.</param>
  void AddRoadLevel3 (int times){


    switch (LastRoadType){
    case 1:
      obj = (GameObject)Instantiate (StartLand, new Vector3 (RandomRoadLength + alreadyDis - StartLandLength, Land2Height + YOffset, 0), Quaternion.identity);
      break;
    case 2:
      obj = (GameObject)Instantiate (StartLand, new Vector3 (RandomRoadLength + alreadyDis - StartLandLength, YOffset, 0), Quaternion.identity);
      break;
    case 3:
      break;
    default :
      obj = (GameObject)Instantiate (StartLand, new Vector3 (RandomRoadLength + alreadyDis, Land2Height + YOffset, 0), Quaternion.identity);
      obj = (GameObject)Instantiate (StartLand, new Vector3 (RandomRoadLength + alreadyDis, YOffset, 0), Quaternion.identity);
      alreadyDis += StartLandLength;
      break;
    }
    for (int i = 0; i < times; i++) {
    obj = (GameObject)Instantiate (MidLand, new Vector3 (RandomRoadLength +alreadyDis, YOffset, 0), Quaternion.identity);
    obj = (GameObject)Instantiate (MidLand, new Vector3 (RandomRoadLength +alreadyDis, Land2Height + YOffset, 0), Quaternion.identity);
      alreadyDis += MidLandLength;
    }
  }

  /// <summary>
  /// 4\5\6添加悬崖
  /// </summary>
  /// <param name="roadType">Road type.</param>
  /// <param name="times">Times.</param>
  void AddRoadLevel456 (int times){

    switch (LastRoadType){
    case 1:
      obj = (GameObject)Instantiate (EndLand, new Vector3 (RandomRoadLength + alreadyDis, YOffset + EndYOffset, 0), Quaternion.identity);  
      alreadyDis += EndLandLength;
      break;
    case 2:
      obj = (GameObject)Instantiate (EndLand, new Vector3 (RandomRoadLength +alreadyDis, Land2Height + YOffset + EndYOffset, 0), Quaternion.identity);
      alreadyDis += EndLandLength;
      break;
    case 3:
      obj = (GameObject)Instantiate (EndLand, new Vector3 (RandomRoadLength + alreadyDis, Land2Height + YOffset + EndYOffset, 0), Quaternion.identity);
      obj = (GameObject)Instantiate (EndLand, new Vector3 (RandomRoadLength + alreadyDis, YOffset + EndYOffset, 0), Quaternion.identity);
      alreadyDis += EndLandLength;
      break;
    default :

      break;
    }

    for (int i = 0; i < times; i++) {
    obj = (GameObject)Instantiate (MidLand, new Vector3 (RandomRoadLength +alreadyDis, YOffset, 0), Quaternion.identity);
      alreadyDis += MidLandLength;
      obj.GetComponent<Land> ().sr.GetComponent<SpriteRenderer> ().enabled = false;
      obj.GetComponent<PolygonCollider2D> ().enabled = false;
    }
  }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值