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

好的,下面我們來說一下,小車的創建,怎麼實現隨機的創建小車,其實在創建小車這裏我主要是用來Instantiate函數來克隆prefab物體,當然這個預製物體也是需要設置一番的,看了視頻的話我們肯定都已經知道了wheelcollider的創建,其實一個預製物體還有一個引導球包括他的腳本和一個包裹小車的用於感知其他小球碰撞的“保護膜”,

這裏有一個層次結構大家可以看一下:


當前選中的那個其實是小車的外殼,他的作用就是在周圍包裹一層collider來保證我們的小車不會從我們的場景中掉下去,用於控制我們小車的腳本是在那個父物體Pickup_Truck中,這樣在一個預製物體生成的時候就會有相應的函數來執行,下面來看一個放在小車上的另一個腳本也就是控制小車的腳本:

#pragma strict
    var collider_FL:WheelCollider;
	var collider_FR:WheelCollider;
	var collider_BL:WheelCollider;
	var collider_BR:WheelCollider;

	var wheel_FL:Transform;
	var wheel_FR:Transform;
	var wheel_BL:Transform;
	var wheel_BR:Transform;

	private var left_light:GameObject;
	private var right_light:GameObject;
	private var bot_light:GameObject;
	private var top_light:GameObject;

    var target:Transform;	
	private var body:Rigidbody;
	private var motor:float;
	var CenterOfMass:Vector3;
	private var maxangle:float=40f;
	private var brake:float;//右轉剎車
	private var go:int ;//是否繼續前行的標誌
	private var car_front:int ;//if any car in front 
	// Use this for initialization
function Start () {
		go=1;
		brake=0;
		motor=20;
		body=GetComponent("Rigidbody");
		body.centerOfMass=CenterOfMass;//用於重心的控制
		//left_light=GameObject.Find("traffic_lights_left");
		right_light=GameObject.Find("traffic_lights_right");
		bot_light=GameObject.Find("traffic_lights_bot");
		top_light=GameObject.Find("traffic_lights_top");
}

function Update () {
	   //渲染車輪的運動
		wheel_FL.Rotate(collider_FL.rpm/60*360*Time.deltaTime,0,0);
		wheel_FR.Rotate(collider_FR.rpm/60*360*Time.deltaTime,0,0);
		wheel_BL.Rotate(collider_BL.rpm/60*360*Time.deltaTime,0,0);
		wheel_BR.Rotate(collider_BR.rpm/60*360*Time.deltaTime,0,0);
		//渲染前輪的旋轉
		wheel_FL.localEulerAngles=wheel_FR.localEulerAngles=new Vector3(wheel_FL.localEulerAngles.x,collider_FL.steerAngle,wheel_FR.localEulerAngles.z);
}

function FixedUpdate(){//表示物理操作的更新
	   //用於更新當前前輪的狀態
		var offsetTargetPos:Vector3= target.position;//小球的位置
		var localTarget:Vector3= transform.InverseTransformPoint(offsetTargetPos);
		var targetAngle:float = Mathf.Atan2(localTarget.x, localTarget.z)*Mathf.Rad2Deg;
		var steer:float = Mathf.Clamp(targetAngle*0.05f, -1, 1)*Mathf.Sign(GetComponent.<Rigidbody>().velocity.magnitude);
		collider_FL.steerAngle=collider_FR.steerAngle=steer*maxangle;
		if(go==1&&car_front==0){//go判斷前方是否有車是否是紅燈
		  
		  brake=0;
		  motor=20;
		}else{//stop
		  motor=0;//動力
		  brake=25000;//剎車
		  var newx:float=body.velocity.x-1>0?body.velocity.x-1:0;
		  body.velocity=new Vector3(newx,0,0);
		  isgoon();//用於紅燈時不斷地檢測當前信號燈的狀態
		}
		collider_BL.motorTorque=collider_BR.motorTorque=motor;
		collider_BL.brakeTorque=collider_BR.brakeTorque=brake;
		
	}
function isbrake(a:int){
		brake=a;
		if(a==0){
		motor=20;
		}else{
		motor=0;
		}
		//Debug.Log (transform.name+" brake is "+brake);
	}
function isgo(a:int){
      car_front=a;
      //Debug.Log(transform.name+" car_front:"+car_front);
	}	
function isgoon(){
        var way_name=getway();
		switch(way_name){
		case "left":
			go=lightcontrol.go;
			break;
		case "right":
		    go=lightcontrol.go;
			break;
		case "bottom":
		    go=tblightcontrol.go;
			break;
		case "top":
		    go=tblightcontrol.go;
			break;
		case "notinroad"://包括最右面用於右轉的那個車道
		    go=1;
		    break;
		}
	}
function OnTriggerEnter(go:Collider ) {
        if(go.transform.name=="trigger"){
         gameObject.BroadcastMessage("lastcollider",go.transform.name);
         }
		if(go.transform.name=="stop_line"){//也就是在路口前
			isgoon();
		//    Debug.Log("stop");
		}
	}
	
	//用於判斷當前在哪條道路上
function getway(){
		var x:float=transform.position.x;
		var z:float=transform.position.z;
		//這裏的車道的計算是不包括最右車道的,因爲最右車道不是右拐就是緊急車道沒有紅燈
		if(x>0&&x<89&&z>96&&z<105.5){//left
			return "left";
		}else if(x>107&&x<200&&z>90.5&&z<102.5){//right
			return "right";
		}else if(x>89&&x<101&&z>0&&z<90.5){//bottom
			return "bottom";
		}else if(x>94&&x<107&&z>105.5&&z<200){//top
			return "top";
		}else{
			return "notinroad";
		}
	}

這裏的註釋也是比較詳細,這裏要說一下的就是那個控制前車輪的變化角度的計算,這個是我借鑑unity的car_ai的例子寫的,主要是計算了一個正切角什麼的,具體的時我也沒太弄懂...不過可以使用,我就直接拿下來了(看來學好數學還是必須的!)。那個判斷當前位置的函數的具體的x,z(y 是垂直的軸)是要大家自己計算的,不同的物理世界肯定是不同,這裏只是給出了一個用於判斷當前位置的方法~



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章