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;
}
}
}
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;
}
}
}