【反向元氣騎士】用unity實現(xiàn)俯視角射擊是一種怎樣的體驗

作者:Yumir
哈嘍大家好我是yumir。
最近沉迷元氣騎士,自從官方把各種“bug”修復之后,這個游戲?qū)ξ疫@種手殘玩家來說實在是太難了。既然打不過,那我就自己寫一個,不就是俯視角射擊嗎,分分鐘給你搞定,一百行代碼都不要。
要說用unity實現(xiàn)俯視角射擊是一種怎樣的體驗,就是太簡單了,要加上元氣騎士,就不簡單了。所以這次只是實現(xiàn)角色控制和手槍射擊,總之“俯視角”和“射擊”都有啦,也是個俯視角射擊游戲了嘛。
具體步驟如下:
實現(xiàn)角色移動。
使角色和槍看向目標點。
實現(xiàn)帶準星的射擊。

實現(xiàn)角色移動首先要有角色,雖然用方塊就可以,但是這樣就會顯得沒有誠意,為了更加有誠意一點我用之前學到的2D綁骨知識做了角色閑置和走路兩個動畫,這樣角色移動的時候就不是平移的,而且還很省時省力【機靈】。
元氣騎士是手游,角色移動是通過屏幕上的搖桿來控制的,現(xiàn)在在電腦上模擬游戲效果直接使用“WASD”來代替,搖桿也比較簡單,下載一個easy touch插件就可以搞定了。
角色移動
首先需要給角色預制體掛載控制腳本以及碰撞器和剛體組件,調(diào)節(jié)碰撞器的大小并將剛體的重力設置為零。
在Update中獲取鍵盤輸入的"Horizontal"和"Vertical"的值,這兩個值分別代表”A、D“和”W、S“的按下,正好形成一個二維坐標,可以用來計算移動的目標點。
movement.x?=?Input.GetAxis("Horizontal");movement.y?=?Input.GetAxis("Vertical");
在FixedUpdate中更新角色的下一個位置,也就是將上面的movement和角色當前位置相加。
rg.MovePosition(rg.position + movement * moveSpeed * Time.fixedDeltaTime);
這樣一來角色就可以像這樣傻fufu的在地圖里亂竄了。

在角色身上添加一個Animator組件,并新建一個動畫狀態(tài)機,用骨骼動畫的方法制作一個”點頭“動畫和一個”走路“動畫,添加轉(zhuǎn)換條件”walk“。

在角色的管理腳本中通過判斷movement的值對walk的值進行修改,角色移動的動畫就設置完畢了。
if (movement == new Vector2(0, 0))
{
???playerAnima.SetBool("walk", false);
}
else
{
???playerAnima.SetBool("walk", true);
}
?
向著鼠標
雖然這實際上是一個只有一面的角色,但是還是要營造出一種角色和手上的槍都是跟著鼠標走的錯覺,首先需要讓槍轉(zhuǎn)向鼠標的方向,再來實現(xiàn)角色轉(zhuǎn)向鼠標的效果。
槍轉(zhuǎn)向鼠標比較簡單,將鼠標位置和槍的位置的差歸一化,其結(jié)果就是槍指向的方向,我的槍口正好是”槍“的右方,所以直接對槍的右方進行賦值。
Vector2 lookDir = target - (Vector2)weaponTrans.position;
lookDir = lookDir.normalized;
weaponTrans.right = lookDir;
?
角色轉(zhuǎn)向鼠標的效果稍微復雜,首先我的角色預制體的內(nèi)部層級是這樣的:

之所以這樣設計是因為槍的后坐力動畫必須這樣實現(xiàn),如果要進一步增加游戲體量也需要將武器獨立設計,也就是在左右翻轉(zhuǎn)的時候我分別需要翻轉(zhuǎn)角色的身體和持有的武器,武器需要變換位置。
? ? ? ?if (rg.position.x > target.x)
????????{
????????????body.flipX = true;
????????????weaponTrans.GetComponentInChildren<SpriteRenderer>().flipY = true;
????????????weaponTrans.position = p2.position;
????????}
????????else if (rg.position.x < target.x)
????????{
????????????body.flipX = false;
????????????weaponTrans.GetComponentInChildren<SpriteRenderer>().flipY = false;
????????????weaponTrans.position = p1.position;
????????}
?

準星射擊
前面預制體層級里面可以看到我已經(jīng)在預制體里面設置好了發(fā)射子彈的位置,只需要生成子彈之后讓子彈向著槍口的方向飛出去就可以了。
我在腳本中聲明了一個用來控制準星大小的變量,生成子彈的時候在槍的角度的基礎上加上抖動角度。再給角色一個向右邊(子彈的前方)的爆發(fā)力,就可以實現(xiàn)射擊的效果了。
?GameObject bullet = Instantiate(bulletPrefab, PlayerControl.instance.firePoint.position, PlayerControl.instance.firePoint.rotation * Quaternion.AngleAxis(Random.Range(0, sight), Vector3.forward));
bullet.GetComponent<Rigidbody2D>().AddForce(bullet.transform.right* bulletForce, ForceMode2D.Impulse);
?
為了使射擊的效果更好一點,我加了特效動畫,首先是射擊時槍后座動畫和射擊噴火的動畫在射擊的時候觸發(fā)播放,我的狀態(tài)機是這樣設計的:

在腳本中通過Animator.Play(狀態(tài)名)調(diào)用。

子彈的碰撞觸發(fā)是寫在子彈預制體的腳本上的,當子彈發(fā)生碰撞時銷毀自身并生成一個特效物體(該物體的動畫最后一幀銷毀自身)。
由于子彈飛出可能會碰到角色的碰撞器,所以需要判斷碰撞到的物體的Tag標簽再進行判斷,注意子彈要勾選Trigger,不然會把玩家角色碰開。
public?class?Bullet?:?MonoBehaviour{
????public?GameObject?hitEffect;
????private?void?OnTriggerEnter2D(Collider2D?collision)
????{
????????if?(collision.transform.tag?!=?"Player")
????????{
????????????Instantiate(hitEffect,?transform.position,?Quaternion.identity);
????????????Destroy(gameObject);
????????}
????}}
?
最后我增加了一個簡單的鏡頭跟隨,就是文章開頭的效果啦,元氣里的鏡頭是受搖桿影響的,有時間也來研究一下吧。因為Github上傳不穩(wěn)定所以以后都導包出來放網(wǎng)盤啦。
https://pan.baidu.com/s/1OREQu6OK0UPVe38Jr-Zb6w


歡迎加入游戲開發(fā)群歡樂攪基:869551769
有意向參與線下游戲開發(fā)學習的讀者可戳這里進一步了解:http://www.levelpp.com/