unity3d射擊類demo

   1 創建地板(floor)和四面牆壁,new Plane實現

              自帶的網格碰撞器Mesh Collider,勾選Convex,否則碰撞其他物體無效

   2 創建幾個cube物體,添加Box Collider和RigidBody,爲cube創建腳本,控制物體移動,由於移動過程中物體會產生反轉,造成前後方向異常,可以採用在updata方法裏重置物體的旋轉角度的方法:transform.localRotation = Quaternion.Euler(0, 0, 0);(四元數重置物體的旋轉角度)

 控制物體移動:

        方法一:改變物體的位移:  transform.Translate(Vector3.left * speed);

        方法二:爲物體添加一個力:rigidbody.AddForce(Vector3.left * speed);

    控制物體跳躍:

        爲了防止物體跳躍過高,需要提前處理跳躍邏輯,只在地面上可以跳躍,需要使用變量控制

        floor物體添加一個Tag標籤,命名爲Floor,

        物體的碰撞事件(碰撞器):onCollisionEnter() OnCollisionExit() OnCollisionStay(),由於物體受重力影響,會一隻在floor上面,物體的碰撞只在OnCollisionStay()方法處理,變量的值也在這個方法裏控制  

  1. void OnCollisionStay(Collision other)
  2. {
  3. Debug.Log("OnCollisionStay other :"+ other.gameObject.tag);
  4. if(other.gameObject.tag =="Floor")
  5. {
  6. isGround =true;
  7. }
  8. }
  9. Update()方法:
  10. if(Input.GetKey(KeyCode.Space))
  11. {
  12. if(isGround)
  13. {
  14. transform.Translate(Vector3.up );
  15. isGround =false;
  16. }
  17. }
        3 物體的碰撞事件(觸發器):OnTriggerEnter() OnTriggerStay() OnTriggerExit()此事件的觸發條件是is Trigger設置爲true纔可以。

  控制射線模擬射擊行爲

    1 在需要發射射線的位置添加組件:Line Renderer;Light;Particle system

    2 Line Renderer 配置材質(射線的顏色),射線起始寬度,結束寬度

    3 Light裏面配置點光源(Point),設置光源顏色(決定了射擊時槍口光顏色)

    4 射線發射物體創建子物體FaceLight(可選),決定了射擊時正前方的顏色

    5 注意:前4個組件默認不選中,以控制射擊動作時射線和光線閃爍

    6 編寫代碼,控制射線

        1 awake函數裏獲取每個組件對象

        2 updata函數裏判斷鼠標左鍵點擊動作,點擊鼠標左鍵即可觸發射擊操作

  1. if(Input.GetButtonDown("Fire1")&& timer >= betweenTwoShot &&Time.timeScale !=0)
  2. {
  3. Shooting();
  4. }
        3 射擊函數:這裏才關聯剛纔未選中的組件,設計射線的位置朝向等
  1. gunLight.enabled =true;
  2. faceLight.enabled =true;
  3. gunParticle.Stop();
  4. gunParticle.Play();
  5. gunLine.enabled =true;
  6. gunLine.SetPosition(0, transform.position);
  7. Debug.Log("射線的位置:"+ transform.position);
  8. shootRay.origin = transform.position;
  9. shootRay.direction = transform.forward;
        4 判斷射線射擊到其他物體的操作:使用Physics.Raycast(射線, RaycastHit射線碰撞器,射線長度,layer層);
        注意:這裏的layer層可以在項目環境中設置,U3D提供了32個layer層,系統佔用8個,其餘的我們可以自定義實現

         5 獲取layer層,並使用步驟4的方法判斷射線是否處於該層
  1. shootableMask =LayerMask.GetMask("shooter");
  2. if(Physics.Raycast(shootRay,out shootHit, gunRange, shootableMask))//光線投射(射線起點,射線方向,射線長度,碰撞器)
  3. {
  4. //進入這個方法只是表示射線射擊到了這個layer裏,並不表示射擊到了目標物體
  5. Debug.Log("射線已投射......");
  6. gunLine.SetPosition(1, shootHit.point);
  7. }
  8. // If the raycast didn't hit anything on the shootable layer...
  9. else
  10. {
  11. // ... set the second position of the line renderer to the fullest extent of the gun's range.
  12. gunLine.SetPosition(1, shootRay.origin + shootRay.direction * gunRange);
  13. Debug.Log("else......");
  14. }

  6 設置腳本模擬敵人受到傷害

    1 爲敵人物體創並掛上腳本CubeHealth,射線發出後,由於敵人屬於環境layer層的子類,可以獲取到射線

    2 使用射線碰撞器方法獲取射線碰撞組件是否已經掛CubeHealth腳本的組件,獲取到後做下一步處理

  1. CubeHealth cubeHealth = shootHit.collider.GetComponent<CubeHealth>();
  2. if(cubeHealth !=null)
  3. {
  4. Debug.Log("射線已投射--------------");
  5. }
    3 敵人受到傷害後生命值減少,生命值小於0時,銷燬
  1. publicvoidTakeDamage(int hit,Vector3 point)
  2. {
  3. defaultHealth -= hit;
  4. Debug.Log("cube health :"+ defaultHealth);
  5. if(defaultHealth <=0)
  6. {
  7. Destroy(gameObject);
  8. }
  9. }
    7 設置攝像機跟隨主角移動
        1 爲主角創建tag,命名爲cube
        2 爲Camera創建腳本,找到主角的tag,插值器跟隨tag移動
  1. publicclassCameraFollow:MonoBehaviour
  2. {
  3. publicTransform target;//設置跟隨的對象,這裏寫主角的tag
  4. Vector3 offset;
  5. publicfloat smoothTime =5f;
  6. // Use this for initialization
  7. voidStart()
  8. {
  9. offset = transform.position - target.position;
  10. }
  11. // Update is called once per frame
  12. voidUpdate()
  13. {
  14. Vector3 v3 = target.position + offset;
  15. //插值器,表示在一定時間內(第三個參數),從座標一(第一個參數)移動到座標二(第二個參數)
  16. transform.position =Vector3.Lerp(transform.position, v3, smoothTime *Time.deltaTime);
  17. }
  18. }
    8 設計遊戲的Splash頁面
         
        1 添加Canvas組件,Canvas組件的子控件設置一個button和一個簡單說明的text
            Canvas組件說明:http://blog.csdn.net/wangmeiqiang/article/details/52531315
        2 爲Canvas增加image組件。
            注意:image組件的Source Image資源必須是Sprite(2D and UI)格式,可以點擊圖片修改格式
        3 爲Canvas綁定的C#代碼增加點擊事件
            1 代碼裏增加onButtonClick()方法
  1. publicvoid onButtonClick()
  2. {
  3. canvas.gameObject.SetActive(false);//設置Canvas隱藏
  4. human.gameObject.SetActive(true);//設置主角顯示
  5. environment.gameObject.SetActive(true);//設置環境顯示
  6. }
            2 爲Button物體增加上述點擊事件
              
     9 模擬隨機敵人出現,增加遊戲趣味
        1 將步驟2裏創建的cube物體創建爲預製體,再增加一個圓形預製體
        2 創建敵人管理類,在environment裏創建空物體cube,綁定管理類cubeManager
        3 管理類的實現邏輯:每隔三秒初始化兩個物體
  1. publicclass cubeManager :MonoBehaviour
  2. {
  3. publicGameObject cubeObject;
  4. publicGameObject sphereObject;
  5. voidStart()
  6. {
  7. InvokeRepeating("CreateCube",3f,3f);
  8. }
  9. voidCreateCube()
  10. {
  11. Vector3 v3 = transform.TransformDirection(Random.Range(0f,6f),Random.Range(0f,4f),Random.Range(-26f,-6f));
  12. Instantiate(cubeObject, v3, transform.rotation);
  13. Instantiate(sphereObject, v3, transform.rotation);
  14. }
  15. }
            4 將預製體綁定到空物體cube上

             5 運行遊戲,發現很多物體創建出來後,由於受物理因素的影響,會產生彈飛效果,飛出environment環境,但是沒有銷燬,造成遊戲卡頓無響應
            解決方法:在地板底部增加一個大於地板區域的,物體飛出範圍碰撞到這個區域後,執行銷燬函數
  1. publicclassDestoryObject:MonoBehaviour{
  2. //設置cube或者floor 的is Trigger爲true時,纔會執行此函數
  3. voidOnTriggerEnter(Collider other)
  4. {
  5. Debug.Log("OnTriggerEnter other :"+ other.gameObject.tag);
  6. if(other.gameObject.tag =="cube")
  7. {
  8. Destroy(other.gameObject);
  9. }
  10. if(other.gameObject.tag =="sphere")
  11. {
  12. Destroy(other.gameObject);
  13. }
  14. }
  15. voidOnTriggerStay(Collider collider)
  16. {
  17. }
  18. voidOnTriggerExit(Collider collider)
  19. {
  20. }
  21. }


        
            
 
    

 

 

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