ok,我們已經知道我們的預製物體都是怎麼個結構了,下面我們就來說一下,具體的隨機創造車輛的函數,我是把這個腳本放到了我的地形這個物體上,當然你也可以放到攝像機上,正如最開始展示的圖片,我們這裏一共有四條道路,暫且我們把它命名爲left,right,bottom,top每一條路都有四個車道,在我們中國都是靠右行駛的嘛,所以其中最靠右的就用於右轉和緊急車輛的行駛。所以我們開始生成車輛,不多說上代碼:
#pragma strict
var counter:float=0;
var SUV:GameObject;
var Pickup_Truck:GameObject;
var IceCreamTruck:GameObject;
var CopCar:GameObject;
private var Car:GameObject;
static var path_name:String;
private var angle:float;
private var n:int;//隨機數的儲存
private var prefabPath:String;
function Start () {
n=0;
}
function Update () {
counter=counter+Time.deltaTime;
if(counter>5){//每隔五秒生成一輛車
Car=choosecar();//獲得不同種類的車
if(n==3){//3是緊急車輛
choosehurryway();
}else{
choosenormalway();
}
counter=0;
}
//Debug.Log(counter);
}
//選擇緊急車輛的way
function choosehurryway(){
n=Random.Range(0,4);//產生隨機數
switch(n){
case 0://left
angle=Mathf.Sqrt(2);
Instantiate (Car, Vector3(67.7,0.6,94.5), new Quaternion(0,angle/2,0,angle/2));//最後那個是一個四元數用於控制車的朝向
path_name="left_hurry";
break;
case 1:
Instantiate (Car, Vector3(103.2,0.6,55.96), new Quaternion(0,0,0,1));
path_name="bot_hurry";
break;
case 2:
Instantiate (Car, Vector3(92.3,0.6,130.8), new Quaternion(0,1,0,0));
path_name="top_hurry";
break;
case 3:
angle=Mathf.Sqrt(2);
Instantiate (Car, Vector3(129,0.6,105.5), new Quaternion(0,-angle/2,0,angle/2));
path_name="right_hurry";
break;
}
}
//選擇普通車輛的way
function choosenormalway(){
n=Random.Range(0,12);//產生隨機數
switch(n){
case 0://left
angle=Mathf.Sqrt(2);
Instantiate (Car, Vector3(67.7,0.6,94.5), new Quaternion(0,angle/2,0,angle/2));
path_name="left_right";
break;
case 1:
angle=Mathf.Sqrt(2);
Instantiate (Car, Vector3(67.7,0.6,98.41), new Quaternion(0,angle/2,0,angle/2));
path_name="left_left";
break;
case 2:
angle=Mathf.Sqrt(2);
Instantiate (Car, Vector3(67.7,0.6,98.41), new Quaternion(0,angle/2,0,angle/2));
path_name="left_go";
break;
case 3://bottom
Instantiate (Car, Vector3(103.2,0.6,55.96), new Quaternion(0,0,0,1));
path_name="bot_right";
break;
case 4:
Instantiate (Car, Vector3(99.5,0.6,55.96), new Quaternion(0,0,0,1));
path_name="bot_left";
break;
case 5:
Instantiate (Car, Vector3(99.5,0.6,55.96), new Quaternion(0,0,0,1));
path_name="bot_go";
break;
case 6://top
Instantiate (Car, Vector3(92.3,0.6,130.8), new Quaternion(0,1,0,0));
path_name="top_right";
break;
case 7:
Instantiate (Car, Vector3(95.9,0.6,130.8), new Quaternion(0,1,0,0));
path_name="top_left";
break;
case 8:
Instantiate (Car, Vector3(95.9,0.6,130.8), new Quaternion(0,1,0,0));
path_name="top_go";
break;
case 9://right
angle=Mathf.Sqrt(2);
Instantiate (Car, Vector3(129,0.6,105.5), new Quaternion(0,-angle/2,0,angle/2));
path_name="right_right";
break;
case 10:
angle=Mathf.Sqrt(2);
Instantiate (Car, Vector3(129,0.6,101.9), new Quaternion(0,-angle/2,0,angle/2));
path_name="right_left";
break;
case 11:
angle=Mathf.Sqrt(2);
Instantiate (Car, Vector3(129,0.6,101.9), new Quaternion(0,-angle/2,0,angle/2));
path_name="right_go";
break;
}
}
function choosecar(){
n=Random.Range(0,4);//產生隨機數
//Debug.Log("car:"+n);
switch(n){
case 0:
return SUV;
case 1:
return Pickup_Truck;
case 2:
return IceCreamTruck;
case 3:
return CopCar;
}
}
//另一種克隆的方式
/*function choosecar(){
//n=Random.Range(0,4);//產生隨機數
var car_name;
n=0;
switch(n){
case 0:
car_name="SUV";
break;
case 1:
car_name="Pickup_Truck";
break;
case 2:
car_name="IceCreamTruck";
break;
case 3:
car_name="CopCar";
break;
}
prefabPath="Assets/Prefabs/"+"SUV"+".prefab";
Debug.Log("car:"+prefabPath);
}*/
下面說一下代碼裏面說的那個四元數,那是一個用於控制小車的朝向參數,它有一個自己的算法:
y = sin(Y/2)cos(Z/2)cos(X/2)+cos(Y/2)sin(Z/2)sin(X/2)
z = cos(Y/2)sin(Z/2)cos(X/2)-sin(Y/2)cos(Z/2)sin(X/2)
w = cos(Y/2)cos(Z/2)cos(X/2)-sin(Y/2)sin(Z/2)sin(X/2)
q = ((x, y, z), w)