Unity3d實現的十字路口的模擬(四)

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);
}*/

下面說一下代碼裏面說的那個四元數,那是一個用於控制小車的朝向參數,它有一個自己的算法:

給定一個歐拉旋轉(X, Y, Z)(即分別繞x軸、y軸和z軸旋轉X、Y、Z度),則對應的四元數爲:
x = sin(Y/2)sin(Z/2)cos(X/2)+cos(Y/2)cos(Z/2)sin(X/2)
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)
這樣就可以自己隨意的設置自己的小車的朝向了,Random.Range(0,12)這個函數是隨機的產生一個0到12的整數(不包括12),當然那我的克隆的方法就是設置了四個共有變量在檢視面板裏面把相應的預製物體拉進去,你也可以嘗試採用我後面註釋掉的方式直接在文件中找到對應的預製物體進行克隆,在uinty裏面凡是public的變量都可以在檢視面板中從工程文件中把相應的實例拖進去,如下圖:

那個SUV等車的模型就是從prefab文件夾中直接拖進去的,這裏還要說一點就是警車的設置,因爲警車直走直線而且只有在最右的道路,所以當隨機出警車的話就只在四個不同的緊急路線中選擇道路進行放置,Instantiate的第二個參數就是生成物體的位置,所以這個位置也要針對不同的物理世界進行不同的變化~



發佈了40 篇原創文章 · 獲贊 38 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章