简单AR游戏
游戏规则
识别指定图片,显示玩家和防御塔,点击按键对玩家进行上下左右移动,点击射击,在射程范围内会对防御塔进行射击,若玩家或者防御塔死亡游戏结束。
游戏实现
游戏场景的搭建
- 识别图
在Vuforia官网上上传两张识别图分别命名为Tower和Player,然后下载这两个Targets。在Unity中准备好Vuforia开发环境,导入下载好的两个Database。
然后按照下图设置,这里的Max Simultaneous Tracked Images本次游戏设置为2,可以同时识别2张图
将Vuforia预制件ImageTarget拖入场景中两次,然后分别设置它的Database和Image Target
- 模型
在Unity的Asset Store中下载模型,我本次游戏使用的是ToonyTinyPeople和CanonTower,导入场景中,将人物和防御塔分别挂载在两张ImageTarget下,调整合适的大小,分别命名为Player和Tower。
为两个模型添加血条,血条的添加是参考分别使用IMGUI和UGUI实现血条的预制设计中的UGUI实现方法。
创建一个Sphere命名为Bullet作为防御塔发射的子弹。在Tower的发射子弹的口的位置创建一个空物体叫做open,作为Tower的子物体,方便定位子弹发射时候的位置。
给Player创建Animator Controller
游戏逻辑的实现
- 玩家
玩家可以进行移动也可以攻击防御塔,受到子弹攻击后会减血。移动是通过用户点击按钮实现(实现效果很差),因为我这次最后是在移动端进行游戏,所以最好是使用与触摸有关来进行移动。点击攻击按钮,玩家会播放攻击动画,如果塔在射程内,则塔掉血。受到子弹攻击是通过两个物体的碰撞检测来实现的。部分函数如下:
//玩家攻击
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);
}
游戏脚本挂载
在场景中创建一个空物体,挂载
SceneController
和UserAction
,在Player上挂载PlayerController
,在Tower上挂载TowerController
。
游戏打包到安卓平台
在Edit->Preference->External Tools中配置好JDK和SDK的路径
然后点击Files->Build Setings,将场景添加并且平台切换成Andriod。点击Player settings修改Other Settings下的 Bundle Identifier 中的com.Company.ProductName为自己的自定义的,例如:com.sysu.test。并选择Android 版本,版本不能低于自己的手机版本。配置好之后点击build保存apk文件。
实现效果
小结
这次AR游戏制作得比较简单,但是在移动端移动使用按键向四周移动体验不是很好,可以制作摇杆或者根据触碰方向移动。代码的耦合度有一点高,还需要改进。塔的位置因为使用LookAt函数有一些不稳定。有时间的话重新再做一次吧。
完整项目和游戏视频请点击传送门