一、子彈的碰撞檢測:
因為子彈的移動速度非常的快,那么如果為子彈添加一個collider,就有可能檢測不到了。
因為collider是每一幀在執行,第一幀子彈可能在100米處,那么下一幀就在900米處了,
那么中間的障礙物就不能被檢測到了。
所以就需要射線檢測:
在每一幀的執行,都向上一幀發射射線,不斷地檢測射線中是否有穿過的障礙物體
1 void Update () { 2 transform.Translate (Vector3.forward * Speed * Time.deltaTime); 3 //用射線檢測,子彈的碰撞,當物體在兩點之間產生的射線內時,算作發生碰撞 4 //1.獲得射線的起點(原點) 5 //2.獲得射線的方向 6 //3.獲得射線的距離 7 Vector3 oriPos = transform.position;//1.射線的起點 8 Vector3 direction = transform.position - oriPos;//2.方向 9 float ength = (transform.position - oriPos).magnitude;//3.射線的距離,取向量的大小 10 //光線投射碰撞 11 RaycastHit hitinfo;//存儲碰撞信息 12 //光線投射,檢測是否發生碰撞 13 bool isCillider = Physics.Raycast (oriPos,direction,out hitinfo,ength); 14 if (isCillider) { 15 //射線檢測到物體,執行以下動作
}
二、子彈的生成
首先想到的是在槍口生成子彈,然后使子彈發生移動
如果是這樣的話,玩家就不能指哪打哪
所以需要在屏幕的正中央,來生成子彈
依舊運用射線,讓子彈延射線方向移動
獲得屏幕中央作為射線原點
發射射線
如果射線碰撞到物體,返回該點,確定原點與該點的方向,子彈沿該方向移動
如果沒有,則目標點為從原點向前移動一定距離,作為目標點,確定方向,子彈沿該方向移動
1 //開始射擊 2 void Shoot(){ 3 //閃光 4 flashcol.Flash (); 5 //生成子彈 6 //GameObject.Instantiate (bulletPrefab, fllow.transform.position, fllow.transform.rotation); 7 GameObject go = GameObject.Instantiate (bulletPrefab,transform.position,Quaternion.identity) as GameObject ; 8 //獲得屏幕中心位置,轉化為世界坐標 9 Vector3 point = soliderCamera.ScreenToWorldPoint (new Vector3 (Screen.width / 2, Screen.height / 2,0)); 10 //定義射線 11 RaycastHit hitinfo; 12 //發射射線 13 bool isCollider = Physics.Raycast (point, soliderCamera.transform.forward/*相機前朝向*/, out hitinfo); 14 if (isCollider) { 15 //如果射線撞擊到了物體 16 go.transform.LookAt (hitinfo.point); 17 } else { 18 //如果射線沒有撞擊物體 19 //那么朝向1000米外的目標點 20 point += soliderCamera.transform.forward * 1000; 21 go.transform.LookAt(point); 22 } 23 }