1. 程式人生 > >2D橫版跳躍遊戲第二節

2D橫版跳躍遊戲第二節

跳躍系統

按空格讓玩家跳躍起來
**原理:將剛體y的速度等於跳躍的速度 **
在C#Move腳本里新增程式碼

(1)先設定跳躍的速度

    public float jumpVelocity = 10;//跳躍的速度

(2)讓玩家跳起來 將剛體y的速度設定成跳躍的速度即可

velocity.y = jumpVelocity;
rgd.velocity = velocity;

(3)設定if語句 判定玩家按下了空格鍵

  			 if (Input.GetKeyDown(KeyCode.Space))//如果輸入了空格鍵
            {
                velocity.y = jumpVelocity;// 將剛體y的速度等於跳躍的速度 
                rgd.velocity = velocity;
            }

至此,儲存進入遊戲 你會發現玩家可以跳躍了在這裡插入圖片描述
但是會發現玩家可以無限跳躍 為了遊戲的平衡性和合理性 要讓玩家到達地面上才可以跳躍
先給地面新增Ground1的標籤
然後我們重新回到指令碼中設定程式碼
(1)設定一個布林值 來判斷玩家是否在地面上

public bool isGround = false;//表示它是否在地面上

(2)有了布林值 就要建立函式來改變它的狀態

    //判斷是否碰到地面,碰到就開啟,沒碰到就關閉  
    public void OnCollisionEnter2D(Collision2D col)//設定引數
    {
        if(col.collider.tag=="Ground1")
        {
            isGround = true;
         }
     }
         public void OnCollisionExit2D(Collision2D col)
    {
        if (col.collider.tag == "Ground1")
        {
            isGround = false;
        }
   }

注意這裡有兩個函式 一個是Enter 一個是Exit 就是碰到和離開的意思
(3)狀態設定好了 就來重新更改if的條件

			if (isGround && Input.GetKeyDown(KeyCode.Space))//如果在地面上並且輸入了空格鍵
            {
                velocity.y = jumpVelocity;
                rgd.velocity = velocity;
            }

至此儲存遊戲 進入遊戲就可以發現 只有在碰到地面時才能跳躍

但是會發現因為重力的原因會導致下降很慢
所以要增高rigidbody2D 的Gravity Scale的值
在這裡插入圖片描述


Gravity Scale增高也會使移動變慢
將摩擦力(Friction)調為0

滑行系統

與跳躍系統類似
在這裡插入圖片描述
原理:碰到牆上時降低速度
先新增牆(Wall)的標籤
與跳躍的判斷方式一樣
我們回到腳本里新增程式碼
(1)設定布林值 來判斷玩家是否在牆面上

public bool isWall = false;//是否在牆上

(2)給OnCollisionEnter2D函式新增新的程式碼

    public void OnCollisionEnter2D(Collision2D col)//設定引數
    {
        if(col.collider.tag=="Ground1")
        {
            isGround = true;
            rgd.gravityScale = 2;
        }
        if (col.collider.tag == "Wall1")//如果碰到牆面時
        {
            isWall = true;//狀態開啟
            rgd.velocity = Vector2.zero;//速度等於0
            rgd.gravityScale = 1;//下降重力降低 讓玩家減速下降
            wallTrans = col.collider.transform;//儲存,記錄這個牆的座標
        }
        public void OnCollisionExit2D(Collision2D col)
    {
        if (col.collider.tag == "Ground1")
        {
            isGround = false;
        }
        if (col.collider.tag == "Wall1")
        {
            isWall = false;//關閉這個狀態
            rgd.gravityScale = 2;//將下降重力調回原速
        }

至此就完成了 但是需要動畫才能體現效果
所以我們要開始新增動畫系統

動畫系統2

先在變數這裡添加布爾值 用來判斷是否碰到牆壁與地面
在這裡插入圖片描述
要讓這個狀態能跟隨腳本里的狀態 需要在腳本里新增程式碼

private Animator anim;//獲取動畫元件
private void Awake()
    {
        anim = this.GetComponent<Animator>();
    }
       public void OnCollisionEnter2D(Collision2D col)
    {
        anim.SetBool("isGround", isGround);//讓unity裡的isGround的bool跟隨這腳本里的isGround
        anim.SetBool("isWall", isWall);
    }
     public void OnCollisionExit2D(Collision2D col)
    {
        anim.SetBool("isGround", isGround);
        anim.SetBool("isWall", isWall);
    }
    

這樣狀態就能實時跟隨了

然後依據著這些變數 給每個狀態新增判斷值 來讓它自動轉換動畫
在這裡插入圖片描述

滑行時調整正確朝向

設定好了滑行的動畫狀態 我們跳躍到牆上的時候會發現這種情況
在這裡插入圖片描述
這是因為 我們沒有調碰到牆壁時的朝向
在腳本里新增函式

 public void ChangeDir()
    {
        isSlide = true;
        if (wallTrans.position.x < transform.position.x)//如果碰到牆的x座標小於玩家的x座標,就說明牆在左邊
        {
            transform.localScale = new Vector3(1, 1, 1);//玩家朝向右
        }
        else
        {
            transform.localScale = new Vector3(-1, 1, 1);//朝向左
        }
    }

新增完以後就完成了

相機跟隨

原理:建立一個目標跟隨他的X值
新建一個指令碼
(1)建立一個目標 用來跟隨

public Transform target;

(2)得到當前座標

Vector3 pos = transform.position;

(3) 因為我們是橫向移動視角的,所以只跟隨x值就好了

pos.x = target.position.x;

(4)把值複製給我們的transfrom.position

transform.position = pos;

將這些程式碼放入到指令碼中 ctrl+s儲存後 將指令碼放入到main camera
再在main camear的面板中Target的目標選player
因為我們在指令碼中新建了一個目標 transfrom可以延伸到unity介面選取目標
選好後再啟動遊戲會發現視角跟著玩家移動了