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

扫描二维码关注公众号,回复: 4084668 查看本文章

为两个模型添加血条,血条的添加是参考分别使用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函数有一些不稳定。有时间的话重新再做一次吧。

完整项目和游戏视频请点击传送门

猜你喜欢

转载自blog.csdn.net/C486C/article/details/80738535