zoukankan      html  css  js  c++  java
  • Unity -- 用EasyAR制作出AR红包

    第一部分:前言
    实现功能:打开APP或运行该demo后,会从天而降红包,有些红包是空的(大一点的),抖动的红包里面“有钱”,点击之后会产生相应的交互。
     
    第二部分:预览

    所用到的资源:
     
    红包模型:链接: https://pan.baidu.com/s/1pKWvqsj 密码: x4h2



    粒子特效链接: https://pan.baidu.com/s/1eSxIbmi 密码: 5suh
     
    NGUI插件:链接: https://pan.baidu.com/s/1hsMa0Ig 密码: uh3a
     
    第三部分:开发环境搭建
    首先我们设置下开发环境,我们最终导出的是 APK文件,所以我们playSetting为Android,并修改屏幕大小为480x800。
    接着我们下载EasyAR SDK (unity版本)并导入到unity中,并到官网申请开发时所用到的Key值,在unity中,删除原有的Camera,将EasyAR_Startup 拖入到面板中,并将key之填入。注意:在这里我们并没有用到图像的识别,因此没必要用ImageTarget。
     
    <ignore_js_op> 
     
    接下来,我们准备红包模型,有些人在导入红包模型的过程中可能会遇到贴图丢失的情况,在这里,我们只需将红包贴图重新挂到材质上即可。
     
    <ignore_js_op> 
     
    在这里,我们准备两个红包预制体,来实现不同的交互。并修改它们的大小以便区分。在这里我给他们命名分别为Hong,HongBao。具体详细参数如下
    Hong:
     
     
    HongBao:
     
    <ignore_js_op> 
     
    <ignore_js_op> 
     
    接下来,我们给两个红包添加Tag,分别为Hong,HongBao。
    <ignore_js_op> <ignore_js_op> 
     
    为两个红包预制体添加BoxCollider,并勾选Trigger。大小自己调节。
     
    最后,我们为我们所交互的那个红包HongBao添加个动画。选中它,并在菜单栏Window-,打开后,点击Create,并保存命名。
     
    <ignore_js_op> 
     
    接着点Add Property,选Transfrom-Scale
    <ignore_js_op> 
    接下来,在中间某一帧选中,并改变大小,值应该大一点,这样才会有抖动的效果:
     
    <ignore_js_op> 
     
     
    第四部分:编写代码产生AR红包
    首先我们先创建几个随机点,分别命名point1,point2,point3,这是红包所降落的位置。参考数值如下:大家可以自行设置
    point1:
     
    <ignore_js_op> 
     
    point2:
    <ignore_js_op> 
     
    point3:
    <ignore_js_op> 
    接下来,我们创建一段代码来使得红包可以降落,在这里用Translate来实现,当然大家可以用其他方法,比如添加Rigidbody,给个受力也可以,不过那样有点麻烦。(补充:当红包的Z坐标小于-8时,就销毁)
     
    [AppleScript] 纯文本查看 复制代码
     
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    public class Move : MonoBehaviour {
            public GameObject par;
            // Use this for initialization
            void Start () {
                     
            }
             
            // Update is called once per frame
            void Update () {
                    transform.Translate (-transform.forward*2f*Time.deltaTime);
                    if (transform.position.z < -8f) {
                            Destroy (this.gameObject);
                    }
            }
    }

    接下来,创建CreateHong空物体,在上面挂上CreateHong.cs脚本,实现随机产生红包。
    [AppleScript] 纯文本查看 复制代码
     
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    using UnityEngine;
    using System.Collections;
     
    public class CreateHong : MonoBehaviour {
            public Transform[] points;
            public GameObject[] hongbaos;
            private int index;
                     
            // Use this for initialization
            void Start () {
                     
                    InvokeRepeating ("CreateHongbao",1f,1f);
            }
             
            // Update is called once per frame
            void Update () {
             
            }
            void CreateHongbao(){
                     
                            int i = Random.Range (0, 10);
                            if (i > 1) {
                                    index = 0;
                            } else {
                                    index = 1;
                            }
                            GameObject go = GameObject.Instantiate (hongbaos [index], points [Random.Range (0, points.Length)].position + new Vector3 (Random.Range (-0.5f, 0.5f), 0, 0), Quaternion.identity) as GameObject;
                            go.transform.Rotate (new Vector3 (270, 180, 0));
                             
                    }
            }
                     
             
    }

    第五部分:实现交互
    我们实现当点击普通红包时由于时间关系我没做任何处理,当点击抖动红包时我们产生炫酷的粒子特效,将如下方法添加到Move.cs中
    [AppleScript] 纯文本查看 复制代码
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void OnMouseDown()
            {
                    if (gameObject.tag == "Hong") {
                            Debug.Log ("ddd");
                    } else if(gameObject.tag=="HongBao") {
                            CreateHong._instace.isCreate = false;
                            GameObject go=GameObject.Instantiate (par,gameObject.transform.position,Quaternion.identity) as GameObject;
                            Destroy (go,2f);
                    }
            }

    并在2s后销毁该粒子
    好了,接下来,我们用NGUI插件实现产生优惠卷或红包(这不重要,重要的是实现思路与方法)
    效果如下

    首先,我们创建Sprite
     

    接着添加TweenScale
     
    <ignore_js_op> 
     
    注意:
     
    <ignore_js_op>
     
    <ignore_js_op>
     
    接下来我们使用单例模式在CreateHong.cs脚本中实现:
    首先声明:
    public static CreateHong _instace;
    接着:
    [AppleScript] 纯文本查看 复制代码
     
    1
    2
    3
    4
    void Awake()
            {
                    _instace = this;
                     
            }

    然后实现方法供外界调用
    [AppleScript] 纯文本查看 复制代码
     
    1
    2
    3
    4
    public void PlayScale()
            {
                    daxiao.gameObject.SetActive (true);
                    daxiao.PlayForward ();
            }

    在Move.CS中实现:
    [AppleScript] 纯文本查看 复制代码
     
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    void OnMouseDown()
            {
                    if (gameObject.tag == "Hong") {
                            Debug.Log ("ddd");
                    } else if(gameObject.tag=="HongBao") {
                            CreateHong._instace.isCreate = false;
                            GameObject go=GameObject.Instantiate (par,gameObject.transform.position,Quaternion.identity) as GameObject;
                            Destroy (go,2f);
                            CreateHong._instace.PlayScale ();
                    }
            }
     
    第六部分:完整代码
     

     

    Move.cs(挂在红包上):
    [AppleScript] 纯文本查看 复制代码
     
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    public class Move : MonoBehaviour {
            public GameObject par;
            // Use this for initialization
            void Start () {
                     
            }
             
            // Update is called once per frame
            void Update () {
                    transform.Translate (-transform.forward*2f*Time.deltaTime);
                    if (transform.position.z < -8f) {
                            Destroy (this.gameObject);
                    }
            }
            void OnMouseDown()
            {
                    if (gameObject.tag == "Hong") {
                            Debug.Log ("ddd");
                    } else if(gameObject.tag=="HongBao") {
                            CreateHong._instace.isCreate = false;
                            GameObject go=GameObject.Instantiate (par,gameObject.transform.position,Quaternion.identity) as GameObject;
                            Destroy (go,2f);
                            CreateHong._instace.PlayScale ();
                    }
            }
    }
    CreateHong.cs:
    [AppleScript] 纯文本查看 复制代码
     
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    using UnityEngine;
    using System.Collections;
     
    public class CreateHong : MonoBehaviour {
            public static CreateHong _instace;
            public Transform[] points;
            public GameObject[] hongbaos;
            private int index;
            public bool isCreate;
            public TweenScale daxiao;
            void Awake()
            {
                    _instace = this;
                    isCreate = true;
            }
                     
            // Use this for initialization
            void Start () {
                     
                    InvokeRepeating ("CreateHongbao",1f,1f);
            }
             
            // Update is called once per frame
            void Update () {
             
            }
            void CreateHongbao(){
                    if (isCreate) {
                            int i = Random.Range (0, 10);
                            if (i > 1) {
                                    index = 0;
                            } else {
                                    index = 1;
                            }
                            GameObject go = GameObject.Instantiate (hongbaos [index], points [Random.Range (0, points.Length)].position + new Vector3 (Random.Range (-0.5f, 0.5f), 0, 0), Quaternion.identity) as GameObject;
                            go.transform.Rotate (new Vector3 (270, 180, 0));
                             
                    } else {
                            return;
                    }
            }
                     
            public void PlayScale()
            {
                    daxiao.gameObject.SetActive (true);
                    daxiao.PlayForward ();
            }
    }
  • 相关阅读:
    如果使用EntityFramework6链接Mysql
    MongoDB联合查询 -摘自网络
    “TableDetails”中列“IsPrimaryKey”的值为DBNull. Mysql EntityFramework
    使用NPOI 转换Excel TO HTML (导出格式不如原生Excel好看)
    如何使用ODBC搭配dsn链接数据库
    Ubuntu16.04安装配置sublime text3
    ubuntu16.04编译安装php7.2
    ubuntu16.04安装flash player与谷歌浏览器(chrome)
    ubuntu16编译安装mysql5.7
    phpstorm+wamp+xdebug配置php调试环境
  • 原文地址:https://www.cnblogs.com/mafeng/p/7600102.html
Copyright © 2011-2022 走看看