找回密码
 立即注册
搜索
EasyAR 教程 Unity 查看内容

EasyAR 开发实例—Pokemon Go(1)

AlbertLee 2017-8-22 12:55

EasyAR+Pokemon Go

Pokemon Go 作为去年最火爆的AR游戏除了让用户体验到AR的神奇外,也让开发者兴奋不已。所以了今天给大家分享如何用EasyAR SDK 来构建类似Pokemon Go 的AR+LBS+IP 的项目。

对于这个较为庞大的项目打算分几期来分享,主要功能或教程目录如下:

1.实现最基础的Pokemon Go 的抛掷效果

2.集成AR录屏功能

3.拍照截屏(录屏)分享朋友圈功能

4.LBS部分,考虑用百度地图/高德地图(或Mapbox)来集成

5.添加语音功能

6.UI部分的设计

7.添加对战功能(精灵PK.即AR联机对战)
........

目前的策划是这样的,当然大家有什么好的想法也可以在下面评论。今天我们来实现第一部分-----抛掷精灵球并捕获皮卡丘。

开发资源:

pokeballs模型:链接: https://pan.baidu.com/s/1dEC6f4l 密码: puwe

皮卡丘模型:链接: https://pan.baidu.com/s/1pL4iehl 密码: 1qji

游戏音效:链接: https://pan.baidu.com/s/1bphIupp 密码: xpbe

Step 1:开发环境
我们将开发资源与EasyAR 2.0 unitypackage 一起导入unity中。框架如图:



在这里为大家准备了很多的PokeBalls 的模型,大家可以自由选择:


把 EasyAR_Startup (我们这里没有运用到识别图片之后展现AR模型,所以不需要ImageTarget),皮卡丘模型,pokeballs 都拖入面板中,效果如图:


修改皮卡丘位置与旋转角度(为了获取在移动端的最好体验),大家可以在不断测试中调出合适的数值,例如:


修改Pokeballs 位置(十分重要):


接下来,在皮卡丘上挂上Box Collider,并为其添加Tag(命名为Pika)。




为Pokeballs 添加rigidbody 与 Sphere Collider。




Step 2:实现抛掷
我们思路是这样的:点击pokeball ,进行抛物线运动。现在有两种方法来实现,一种是通过Rigidbody来施力实现,另一种是通过transform 来合成加速度实现。

第一种:

在Pokeball 上新建一段脚本:



最主要的是判断点击抬起之后,为其添加向前的推力与向上的动力,来实现其运动。接着,实时判断通过射线来插值的方式实现其运动。

我们设置好向前与向上的速度后,可以实现抛掷效果,但是缺点是不够灵活,很能与皮卡丘进行碰撞检测。

第二种:

第二种我们通过transform 的方法来实现(直接绑定我们需要与之碰撞的对象即可):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Throw : MonoBehaviour {
    public const float g = 9.8f;

    public GameObject target;
    public float speed = 10;
    private float verticalSpeed;
    private Vector3 moveDirection;

    private float angleSpeed;
    private float angle;

    bool drawing=false;
    void Start()
    {
        float tmepDistance = Vector3.Distance(transform.position, target.transform.position);
        float tempTime = tmepDistance / speed;
        float riseTime, downTime;
        riseTime = downTime = tempTime / 2;
        verticalSpeed = g * riseTime;
        transform.LookAt(target.transform.position);

        float tempTan = verticalSpeed / speed;
        double hu = Mathf.Atan(tempTan);
        angle = (float)(180 / Mathf.PI * hu);
        transform.eulerAngles = new Vector3(-angle, transform.eulerAngles.y, transform.eulerAngles.z);
        angleSpeed = angle / riseTime;

        moveDirection = target.transform.position - transform.position;
    }


    void OnMouseDown()
    {
        drawing = true;

    }

    private float time;
    void Update()
    {
        if (drawing) {
            time += Time.deltaTime;
            float test = verticalSpeed - g * time;
            transform.Translate (moveDirection.normalized * speed * Time.deltaTime, Space.World);
            transform.Translate (Vector3.up * test * Time.deltaTime, Space.World);
            float testAngle = -angle + angleSpeed * time;
            transform.eulerAngles = new Vector3 (testAngle, transform.eulerAngles.y, transform.eulerAngles.z);
        }
    }

}

然后,将对象拖给这段脚本即可:


Step 3:实现碰撞交互
当pokeball 与皮卡丘相碰撞时,我们定义为捕获操作,这是销毁皮卡丘鱼pokeball并播放音效。

首先我们在 pokeball 下面添加“AudioSource”组件


然后在脚本里添加方法:

void OnTriggerEnter(Collider col)
    {
        if (col.tag == "Pika") {
            sound.Play ();
            Destroy (col.gameObject);
            Destroy (this.gameObject,3f);
        }

    }

完整代码:

链接: https://pan.baidu.com/s/1dFMpIcp 密码: 57bf

捕获的功能现在就可以实现了,后期我们会对其进行优化,大家有什么问题可以评论,一起探讨。
鲜花
鲜花 (2)
握手
握手
雷人
雷人
路过
路过
鸡蛋
鸡蛋

刚表态过的朋友 (2 人)

分享至 : QQ空间
收藏

查看全部评论>>