1. 程式人生 > >Unity3d學習之路-簡單AR遊戲

Unity3d學習之路-簡單AR遊戲

簡單AR遊戲

遊戲規則

識別指定圖片,顯示玩家和防禦塔,點選按鍵對玩家進行上下左右移動,點選射擊,在射程範圍內會對防禦塔進行射擊,若玩家或者防禦塔死亡遊戲結束。

遊戲實現

遊戲場景的搭建

  • 識別圖

在Vuforia官網上上傳兩張識別圖分別命名為Tower和Player,然後下載這兩個Targets。在Unity中準備好Vuforia開發環境,匯入下載好的兩個Database。

photo

然後按照下圖設定,這裡的Max Simultaneous Tracked Images本次遊戲設定為2,可以同時識別2張圖

photo

將Vuforia預製件ImageTarget拖入場景中兩次,然後分別設定它的Database和Image Target

photo

  • 模型

在Unity的Asset Store中下載模型,我本次遊戲使用的是ToonyTinyPeople和CanonTower,匯入場景中,將人物和防禦塔分別掛載在兩張ImageTarget下,調整合適的大小,分別命名為Player和Tower。

photo

為兩個模型新增血條,血條的新增是參考分別使用IMGUI和UGUI實現血條的預製設計中的UGUI實現方法。

photo

建立一個Sphere命名為Bullet作為防禦塔發射的子彈。在Tower的發射子彈的口的位置建立一個空物體叫做open,作為Tower的子物體,方便定位子彈發射時候的位置。

photo

給Player建立Animator Controller

photo

遊戲邏輯的實現

  • 玩家

玩家可以進行移動也可以攻擊防禦塔,受到子彈攻擊後會減血。移動是通過使用者點選按鈕實現(實現效果很差),因為我這次最後是在移動端進行遊戲,所以最好是使用與觸控有關來進行移動。點選攻擊按鈕,玩家會播放攻擊動畫,如果塔在射程內,則塔掉血。受到子彈攻擊是通過兩個物體的碰撞檢測來實現的。部分函式如下:

//玩家攻擊
public void PlayerAttack()
{
    //播放攻擊動畫
    player.GetComponent<Animator>().SetTrigger("shoot");
    //如果玩家在塔的範圍內,塔掉血
    float dis = Vector3.Distance(tower.transform.position, player.transform.position);
    if (dis < distance)
    {
        tower.GetComponent<TowerController>().ReduceBlood();
    }
}
  • 防禦塔

防禦塔在檢測到玩家進入射程範圍內會間隔2s發射一次子彈,因為子彈時間飛行比發射間隔快,所以場景中一直只有一顆子彈重複利用。防禦塔是一直朝向玩家。部分函式如下:

void Update ()
{
    if(player != null && !gameover)
    {
        float dis = Vector3.Distance(transform.position, player.transform.position);
        if(dis < attackDistance)
        {
            if(player.GetComponent<PlayerController>().getPlayerLife()>0)
            {
                transform.LookAt(player.transform);
                time += Time.deltaTime;
                if(time >= 2)
                {
                    //發射子彈
                    shoot(player.transform.position);
                    time = 0;
                }
            }
        }
        //子彈朝玩家發射
        if (bullet.activeSelf)
            bullet.transform.position = Vector3.MoveTowards(bullet.transform.position, player.transform.position, Time.deltaTime * speed);
        if (bullet.transform.position == player.transform.position)
        {
             bullet.SetActive(false);
        }
    }
}
//發射子彈
void shoot(Vector3 position)
{
    bullet.transform.position = open.position;
    bullet.SetActive(true);
}

遊戲指令碼掛載

在場景中建立一個空物體,掛載SceneControllerUserAction,在Player上掛載PlayerController,在Tower上掛載TowerController

photo

遊戲打包到安卓平臺

在Edit->Preference->External Tools中配置好JDK和SDK的路徑

photo

然後點選Files->Build Setings,將場景新增並且平臺切換成Andriod。點選Player settings修改Other Settings下的 Bundle Identifier 中的com.Company.ProductName為自己的自定義的,例如:com.sysu.test。並選擇Android 版本,版本不能低於自己的手機版本。配置好之後點選build儲存apk檔案。

photo

photo

實現效果

gif

小結

這次AR遊戲製作得比較簡單,但是在移動端移動使用按鍵向四周移動體驗不是很好,可以製作搖桿或者根據觸碰方向移動。程式碼的耦合度有一點高,還需要改進。塔的位置因為使用LookAt函式有一些不穩定。有時間的話重新再做一次吧。

完整專案和遊戲視訊請點選傳送門