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的第二个参数就是生成物体的位置,所以这个位置也要针对不同的物理世界进行不同的变化~