赞
踩
《宝可梦GO》(pokemonGo)是一款能对现实世界中出现的宝可梦进行探索捕捉、战斗以及交换的游戏。玩家可以通过智能手机在现实世界里发现宝可梦,进行抓捕和战斗。玩家作为宝可梦训练师抓到的宝可梦越多会变得越强大,从而有机会抓到更强大更稀有的宝可梦。本次开发复刻了宝可梦GO的LBS地图系统、AR捕捉系统以及仓库系统。
【传统部分】
【创新内容】
1、LBS:
2、AR
图块缓冲越大,一次申请访问的地图就越大
单位取真实世界的米
值越大,地图比例越小。放大和缩小不会更改比例尺,意味着放再大单位还是取真实世界的米
开始游戏时,世界中心坐标将会和场景中心坐标(0,0,0)匹配,并且不会变动,人物的行走会改变人物的位置坐标,这与普通地图SDK有所不同(普通地图SDK人物不产生位移,地图画面移动)
修改角色比例与方向,再拖到Avatar下,将角色物体拖到Avtar物体的Move Avtar脚本的Avatar Figure上
创建文件夹,创建脚本BoyControl.cs
内容如下:
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
- public class BoyControl : MonoBehaviour {
-
- //储存动画控制器
-
- private Animator ator;
-
- //储存角色控制器
-
- private MoveAvatar moveAvatar;
-
- // Use this for initialization
-
- void Start () {
-
- //获取动画控制器
-
- ator = gameObject.GetComponent<Animator>();
-
- //获取父物体的角色控制器
-
- moveAvatar = transform.parent.GetComponent<MoveAvatar>();
-
- }
-
-
-
- // Update is called once per frame
-
- void Update () {
-
- //如果角色控制器当前的状态是 定义的待机状态
-
- if(moveAvatar.animationState == MoveAvatar.AvatarAnimationState.Idle)
-
- {
-
- //而且当前动画不是待机动画,就将动画控制器的动画设置为待机
-
- if(!ator.GetCurrentAnimatorStateInfo(0).IsName("Idle"))ator.SetTrigger("Idle");
-
- }
-
- else if(moveAvatar.animationState == MoveAvatar.AvatarAnimationState.Run)
-
- {
-
- if (!ator.GetCurrentAnimatorStateInfo(0).IsName("Run")) ator.SetTrigger("Run");
-
- }
-
- else if(moveAvatar.animationState == MoveAvatar.AvatarAnimationState.Walk)
-
- {
-
- if (!ator.GetCurrentAnimatorStateInfo(0).IsName("Walk")) ator.SetTrigger("Walk");
-
- }
-
- }
-
- }
注意将main camera的target设置为boy模型,保证视角的正确
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class InsPoint : MonoBehaviour {
-
- //储存地图角色
-
- public GameObject Ava;
-
- //储存事件点预制体
-
- public GameObject PrePoint;
-
- //储存距离范围最小点
-
- public float MinDis = 3f;
-
- //储存距离范围最大点
-
- public float MaxDis = 50f;
-
- //储存当前角色当前位置
-
- private Vector3 v3Ava;
-
- // Use this for initialization
-
- void Start () {
-
-
-
-
- }
-
-
-
-
- // Update is called once per frame
-
- void Update () {
-
-
-
-
- }
-
-
-
-
- public void InsPointFuc()
-
- {
-
- //获取角色坐标位置
-
- v3Ava = Ava.transform.position;
-
- //从距离范围内取一个随机距离值
-
- float _dis = Random.Range(MinDis, MaxDis);
-
- //从原点为(0,0)随机获取一个方向的向量
-
- Vector2 _pOri = Random.insideUnitCircle;
-
- //将该方向向量标准化
-
- Vector2 _pNor = _pOri.normalized;
-
- //计算生成随机点的位置向量 随机点x坐标 随机点y坐标
-
- Vector3 _v3Point = new Vector3(v3Ava.x + _pNor.x * _dis, 0, v3Ava.z + _pNor.y * _dis);
-
- //生成随机点的预制体
-
- GameObject poiMark = Instantiate(PrePoint, _v3Point, transform.rotation);
-
-
-
-
- }
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class PointEvent : MonoBehaviour {
-
-
-
-
- //分别储存精灵、精灵球、食物的预制体
-
- public GameObject Pet;
-
- public GameObject Ball;
-
- public GameObject Food;
-
- //储存偏移量
-
- private Vector3 offset;
-
- // Use this for initialization
-
- void Start () {
-
- int _randomEvent = Random.Range(0, 3);//随机选 0 1 2
-
- if (_randomEvent == 0) insPet();
-
- else if (_randomEvent == 1) insBall();
-
- else if (_randomEvent == 2) insFood();
-
-
-
-
- offset = new Vector3(0, 5f, 0);
-
- }
-
-
-
-
- // Update is called once per frame
-
- void Update () {
-
-
-
-
- }
-
- private void insPet()
-
- {
-
- Instantiate(Pet, transform.position + offset, transform.rotation);
-
- }
-
- private void insFood()
-
- {
-
- Instantiate(Food, transform.position + offset, transform.rotation);
-
- }
-
- private void insBall()
-
- {
-
- GameObject _ball = Instantiate(Ball, transform.position + offset, transform.rotation);
-
- //设置精灵球的角度
-
- _ball.transform.localEulerAngles = new Vector3(-30f, 0, 0);
-
- }
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class MoveEffect : MonoBehaviour {
-
-
-
-
- //设置起始弧度参数
-
- private float radian = 0f;
-
- //弧度变化值
-
- private float perRad = 0.03f;
-
- //位移偏移量
-
- private float add = 0f;
-
- //储存物体生成时的真实坐标
-
- private Vector3 posOri;
-
- // Use this for initialization
-
- void Start () {
-
- //获取初始位置的坐标信息,否则就是0,0,0
-
- posOri = transform.position;
-
- }
-
-
-
-
- // Update is called once per frame
-
- void Update () {
-
-
-
-
- //弧度值变化
-
- radian += perRad;
-
- //计算偏移量
-
- add = Mathf.Sin(radian);
-
- //更改物体位置
-
- transform.position = posOri + new Vector3(0, add, 0);
-
-
-
-
- //控制物体旋转(我试了下,无论是space.self还是world都是绕自己y轴旋转 怪)
-
- transform.Rotate(0, Time.deltaTime * 25f, 0, Space.World);
-
-
-
-
- }
-
- }
编写随机生成事件
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class InsPets : MonoBehaviour {
-
- //创建数组 存储精灵预制体
-
- private GameObject[] pets;
-
-
-
-
- void Awake()
-
- {
-
- pets = Resources.LoadAll<GameObject>("Pets");
-
- }
-
-
-
-
- // Use this for initialization
-
- void Start () {
-
- InsPet();
-
- }
-
-
-
-
- // Update is called once per frame
-
- void Update () {
-
-
-
-
- }
-
-
-
-
- private void InsPet()//注意不要和脚本同名
-
- {
-
- //随机生成一个精灵序号
-
- int _petIndex = Random.Range(0, pets.Length);
-
- //生成精灵
-
- Instantiate(pets[_petIndex], transform.position, transform.rotation);
-
- }
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
- using UnityEngine.UI;
-
- public class UI_Mgr_02 : MonoBehaviour {
-
-
-
-
- //储存精灵球和食物的数量
-
- public Text Tx_BallNum;
-
- public Text Tx_FoodNum;
-
- //申请静态类变量,便于其他脚本直接调用该类的方法
-
- public static UI_Mgr_02 Instance;
-
-
-
-
- void Awake()
-
- {
-
- Instance = this;
-
- }
-
-
-
-
- public void AddBallNum()
-
- {
-
- int _num = int.Parse(Tx_BallNum.text);
-
- _num++;
-
- Tx_BallNum.text = _num.ToString();
-
- }
-
- public void AddFoodNum()
-
- {
-
- int _num = int.Parse(Tx_FoodNum.text);
-
- _num++;
-
- Tx_FoodNum.text = _num.ToString();
-
- }
-
-
-
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class Ball_Find : MonoBehaviour {
-
-
-
-
- //碰撞函数
-
- void OnTriggerEnter(Collider other)
-
- {
-
- if(other.tag == "Avatar")//与标签为“Avatar”的物体碰撞
-
- {
-
- UI_Mgr_02.Instance.AddBallNum();
-
- //销毁物体
-
- Destroy(gameObject);
-
- }
-
- }
-
-
-
-
- }
- //储存捕捉面板
-
- public GameObject Im_Catch
-
-
-
-
- //设置捕捉面板的激活状态
-
- public void SetIm_Catch(bool bl)
-
- {
-
- Im_Catch.SetActive(bl);
-
- };
-
- 将捕捉面板物体挂载到ui管理物体的脚本上
- 创建脚本cs
-
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class Pet_Find : MonoBehaviour {
-
- void Start()
-
- {
-
- //精灵初始朝向角色
-
- transform.LookAt(GameObject.FindGameObjectWithTag("Avatar").transform);
-
- }
-
- void OnTriggerEnter(Collider other)
-
- {
-
- if (other.tag == "Avatar")//与标签为“Avatar”的物体碰撞
-
- {
-
- UI_Mgr_02.Instance.SetIm_Catch(true);
-
- //销毁物体
-
- Destroy(gameObject);
-
- }
-
- }
-
-
-
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class PointEvent : MonoBehaviour {
-
-
-
-
- //分别储存精灵、精灵球、食物的预制体
-
- private GameObject[] Pets;
-
- private GameObject[] Balls;
-
- private GameObject[] Foods;
-
- //储存偏移量,让生成的物体高一点
-
- private Vector3 offset;
-
- // Use this for initialization
-
- void Awake()
-
- {
-
- Balls = Resources.LoadAll<GameObject>("Balls");
-
- Foods = Resources.LoadAll<GameObject>("Foods");
-
- Pets = Resources.LoadAll<GameObject>("Pets");
-
- }
-
- void Start () {
-
- offset = new Vector3(0, 5f, 0);
-
- int _randomEvent = Random.Range(0, 3);//随机选 0 1 2
-
- if (_randomEvent == 0) insPet();
-
- else if (_randomEvent == 1) insBall();
-
- else if (_randomEvent == 2) insFood();
-
- }
-
-
-
-
- // Update is called once per frame
-
- void Update () {
-
-
-
-
- }
-
- private void insPet()
-
- {
-
- // 随机生成一个精灵序号
-
- int _petIndex = Random.Range(0, Pets.Length);
-
- Instantiate(Pets[_petIndex], transform.position + offset, transform.rotation);
-
- }
-
- private void insFood()
-
- {
-
- int _foodIndex = Random.Range(0, Foods.Length);
-
- Instantiate(Foods[_foodIndex], transform.position + offset, transform.rotation);
-
- }
-
- private void insBall()
-
- {
-
- int _ballIndex = Random.Range(0, Foods.Length);
-
- GameObject _ball = Instantiate(Balls[_ballIndex], transform.position + offset, transform.rotation);
-
- //设置精灵球的角度
-
- _ball.transform.localEulerAngles = new Vector3(-30f, 0, 0);
-
- }
-
-
-
-
- }
- private void insFood()
-
- {
-
- int _foodIndex = Random.Range(0, Foods.Length);
-
- GameObject _food = Instantiate(Foods[_foodIndex], transform.position + offset, transform.rotation);
-
-
-
-
- //添加碰撞体组件
-
- _food.AddComponent<BoxCollider>();
-
- //勾选isTrigger
-
- _food.GetComponent<BoxCollider>().isTrigger = true;
-
- //设置碰撞体
-
- _food.GetComponent<BoxCollider>().center = new Vector3(0, 0, 0);
-
- _food.GetComponent<BoxCollider>().size = new Vector3(0.33f, 0.3f, 0.33f);
-
- //添加刚体组件
-
- _food.AddComponent<Rigidbody>();
-
- //更改刚体组件的限制
-
- _food.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll;
-
- //添加moveeffect组件和find组件
-
- _food.AddComponent<MoveEffect>();
-
- _food.AddComponent<Food_Find>();
-
- }
-
- private void insBall()
-
- {
-
- int _ballIndex = Random.Range(0, Foods.Length);
-
- GameObject _ball = Instantiate(Balls[_ballIndex], transform.position + offset, transform.rotation);
-
- //设置精灵球的角度
-
- _ball.transform.localEulerAngles = new Vector3(-30f, 0, 0);
-
- //添加球形碰撞体组件
-
- _ball.AddComponent<SphereCollider>();
-
- //勾选isTrigger
-
- _ball.GetComponent<SphereCollider>().isTrigger = true;
-
- //设置碰撞体大小
-
- _ball.GetComponent<SphereCollider>().radius = 0.011f;
-
- //添加刚体组件
-
- _ball.AddComponent<Rigidbody>();
-
- //更改刚体组件的限制
-
- _ball.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeAll;
-
- //添加moveeffect组件和find组件
-
- _ball.AddComponent<MoveEffect>();
-
- _ball.AddComponent<Ball_Find>();
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class ARBallCtrl : MonoBehaviour {
-
- //储存精灵球预制体
-
- private GameObject[] balls;
-
- //精灵球生成位置
-
- public Transform PosInsBall;
-
- // Use this for initialization
-
- void Start () {
-
- //加载路径在“Resources/Balls”的预制体
-
- balls = Resources.LoadAll<GameObject>("Balls");
-
- insBall();
-
- }
-
-
-
-
- // Update is called once per frame
-
- void Update () {
-
-
-
-
- }
-
- private void insBall()
-
- {
-
- Instantiate(balls[0], PosInsBall.position, PosInsBall.rotation);
-
- //设置精灵球的父物体 为了保证发射前始终在屏幕的固定位置
-
- _ball.transform.SetParent(PosInsBall);
-
- //为精灵球添加球体碰撞器组件
-
- _ball.gameObject.AddComponent<SphereCollider>();
-
-
-
- }
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class ARShootBall : MonoBehaviour {
-
-
-
-
- //设置给精灵球的力度
-
- public float FwdForce = 200f;
-
- //设置夹角的参照数值
-
- public Vector3 StanTra = new Vector3(0, 1f, 0);
-
-
-
-
- //判断手指是否碰到精灵球位置
-
- private bool blTouched = false;
-
- //判断精灵球是否发射
-
- private bool blShooted = false;
-
- //手指滑动起始点
-
- private Vector3 startPosition;
-
- //手指滑动的终点
-
- private Vector3 endPosition;
-
- //手指滑动的距离
-
- private float disFlick;
-
- //手指滑动的速度
-
- private float speedFlick;
-
- //手指滑动的时间(帧数)
-
- private int timeFlick = 0;
-
- //手指滑动的偏移向量
-
- private Vector3 offset;
-
- //记录主摄像机
-
- private Camera cameraMain;
-
-
-
-
- // Use this for initialization
-
-
-
-
- void Start () {
-
- //赋值为主摄像机
-
- cameraMain = Camera.main;
-
- }
-
-
-
-
- // Update is called once per frame
-
- void Update () {
-
- if(blTouched)//如果按在小球上,允许检测手指的滑动
-
- {
-
- slip();
-
-
-
-
- }
-
- }
-
- //重置参数
-
- private void resetVari()
-
- {
-
- //起始位置为手指按下的位置
-
- startPosition = Input.mousePosition;
-
- }
-
- //当鼠标/手指 按下/触摸到 脚本挂载的物体
-
- void OnMouseDown()
-
- {
-
- if(blShooted == false)//如果没发射
-
- {
-
- blTouched = true;//允许检测手指滑动
-
- }
-
- }
-
- //计算手指的滑动
-
- private void slip()
-
- {
-
- timeFlick += 25;//时间每帧增加25
-
- if(Input.GetMouseButtonDown(0))//当手指按下的时候
-
- {
-
- resetVari();//重置参数
-
- }
-
- if(Input.GetMouseButton(0))//当手指一直按下的时候
-
- {
-
- //将终点位置坐标刷新为手指位置
-
- endPosition = Input.mousePosition;
-
- //获取手指在世界坐标上的偏移量
-
- offset = cameraMain.transform.rotation * (endPosition - startPosition);
-
- //计算手指滑动的距离
-
- disFlick = Vector3.Distance(endPosition, startPosition);
-
- }
-
- if(Input.GetMouseButtonUp(0))//当手指抬起来
-
- {
-
- //计算速度
-
- speedFlick = disFlick / timeFlick;
-
- //手指触摸设置为false
-
- blTouched = false;
-
- //时间重置
-
- timeFlick = 0;
-
- //如果手指滑动距离超过20而且是向上滑动
-
- if(disFlick > 20 && endPosition.y- startPosition.y > 0)
-
- {
-
- //允许发射
-
- shootBall();
-
-
-
-
- }
-
- }
-
- }
-
-
-
-
- //发射精灵球
-
- private void shootBall()
-
- {
-
- //给精灵球添加刚体组件
-
- transform.gameObject.AddComponent<Rigidbody>();
-
- //使用局部变量储存刚体组件,便于后续操作
-
- Rigidbody _rigBall = transform.GetComponent<Rigidbody>();
-
- //给精灵球一个初始速度
-
- _rigBall.velocity = offset.normalized * speedFlick;
-
- //为精灵球添加力度,方向为朝着屏幕前方(即为摄像机的前方)
-
- _rigBall.AddForce(cameraMain.transform.forward * FwdForce);
-
- //让精灵球旋转
-
- _rigBall.AddTorque(transform.right);
-
- //设置精灵球阻力
-
- _rigBall.drag = 0.5f;
-
- //设置为发射状态
-
- blShooted = true;
-
- //让发射出去的球脱离父物体
-
- transform.parent = null;
-
- //执行协程函数
-
- StartCoroutine(LateInsBall());
-
- }
-
-
-
-
- //协程函数
-
- IEnumerator LateInsBall()
-
- {
-
- yield return new WaitForSeconds(0.2f);
-
- //延迟两秒执行
-
- //生成新的精灵球
-
- ARBallCtrl.Instance.InsNewBall();
-
- }
-
- }
-
- 删掉BallPos的碰撞器和渲染插件,只需要为精灵球提供位置
- 将cs的脚本生成新精灵球函数insBall改为公有函数方便调用,并修改:
-
- //申请脚本静态类对象
-
- public static ARBallCtrl Instance;
-
- public void InsNewBall()
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class ARInsPet : MonoBehaviour {
-
-
-
-
- //储存生成精灵位置的物体
-
- public Transform[] TraPos;
-
- //储存精灵
-
- private GameObject[] pets;
-
- // Use this for initialization
-
- void Start () {
-
- pets = Resources.LoadAll<GameObject>("Pets");
-
- }
-
-
-
-
- // Update is called once per frame
-
- void Update () {
-
-
-
-
- }
-
-
-
-
- public void InsPet()
-
- {
-
- //随机选一个生成的位置点
-
- int _index = Random.Range(0, TraPos.Length);
-
- //获取该位置的transform
-
- Transform _tra = TraPos[_index];
-
- //在该位置生成精灵
-
- Instantiate(pets[0], _tra.position, _tra.rotation);
-
-
-
-
- }
-
- }
- using UnityEngine.SceneManagement;
-
-
-
-
- public void Btn_GoARScn()
-
- {
-
- SceneManager.LoadScene("AR_Scn");
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
- using UnityEngine.SceneManagement;
-
- public class ARUI_Mgr : MonoBehaviour {
-
-
-
-
- public void Btn_GoMapScn()
-
- {
-
- SceneManager.LoadScene("Map_Scn");
-
- }
-
- }
同一文件夹中的预制体类型要相同
同一批预制体的配置信息保持一致(坐标轴位置、旋转角度、模型朝向、导出前的操作)
外部导入的资源在进入unity前就要统一标准
- //在该位置生成精灵
-
- GameObject _pet = Instantiate(pets[0], _tra.position, _tra.rotation);
-
- //调整缩放比例
-
- _pet.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f) ;
- //设置精灵球的大小为25倍
-
- _ball.transform.localScale = new Vector3(25f, 25f, 25f);
-
-
-
-
- 用代码来调整碰撞器的缩放比,并添加发射精灵球脚本
-
-
-
-
- //为精灵球添加发射精灵球脚本
-
- _ball.gameObject.AddComponent<ARShootBall>();
-
- //设置精灵球的大小为25倍
-
- _ball.transform.localScale = new Vector3(25f, 25f, 25f);
-
- //获取碰撞器并更改半径
-
- _ball.GetComponent<SphereCollider>().radius = 0.01f;
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public static class StaticData {
-
- //精灵球初始数量
-
- public static int BallNum = 5;
-
- }
- //精灵球数量
-
- public Text Tx_BallNum;
-
- //单例
-
- public static ARUI_Mgr Instance;
-
- void Awake()
-
- {
-
- Instance = this;
-
- }
-
- public void UpdateUIBallNum()
-
- {
-
- Tx_BallNum.text = StaticData.BallNum.ToString();
-
- }
- void Start () {
-
- //加载路径在“Resources/Balls”的预制体
-
- balls = Resources.LoadAll<GameObject>("Balls");
-
- //刷新精灵球数量
-
- ARUI_Mgr.Instance.UpdateUIBallNum();
-
- InsNewBall();
-
- }
-
- public void InsNewBall()
-
- {
-
- if(StaticData.BallNum > 0)
-
- {
-
- GameObject _ball = Instantiate(balls[0], PosInsBall.position, PosInsBall.rotation);
-
- //设置精灵球的父物体 为了保证发射前始终在屏幕的固定位置
-
- _ball.transform.SetParent(PosInsBall);
-
- //为精灵球添加球体碰撞器组件
-
- _ball.gameObject.AddComponent<SphereCollider>();
-
- //为精灵球添加发射精灵球脚本
-
- _ball.gameObject.AddComponent<ARShootBall>();
-
- //设置精灵球的大小为25倍
-
- _ball.transform.localScale = new Vector3(25f, 25f, 25f);
-
- //获取碰撞器并更改半径
-
- _ball.GetComponent<SphereCollider>().radius = 0.01f;
-
-
-
-
- }
-
- }
- //减少精灵球数量
-
- StaticData.BallNum--;
-
- //更新UI
-
- ARUI_Mgr.Instance.UpdateUIBallNum();
- void Start()
-
- {
-
- Tx_BallNum.text = StaticData.BallNum.ToString();
-
- }
-
- public void AddBallNum()
-
- {
-
- StaticData.BallNum++;
-
- Tx_BallNum.text = StaticData.BallNum.ToString();
-
- }
- //当前正要捕捉的精灵序号
-
- public static int CatchingPetIndex;
- void OnTriggerEnter(Collider other)
-
- {
-
- if (other.tag == "Avatar")//与标签为“Avatar”的物体碰撞
-
- {
-
- //显示捕捉面板
-
- UI_Mgr_02.Instance.SetIm_Catch(true);
-
- //当与角色碰撞时,更改全局变量:要捕捉的精灵序号
-
- StaticData.CatchingPetIndex = PetIndex;
-
- //销毁物体
-
- Destroy(gameObject);
-
- }
-
- }
- private void insPet()
-
- {
-
- // 随机生成一个精灵序号
-
- int _petIndex = Random.Range(0, Pets.Length);
-
- //储存随机生成的精灵
-
- GameObject _pet = Instantiate(Pets[_petIndex], transform.position + offset, transform.rotation);
-
- //更新精灵的序号
-
- _pet.GetComponent<Pet_Find>().PetIndex = _petIndex;
-
- }
-
- 回到AR场景,修改ARInsPet脚本中的InsPet函数。并修改start函数
-
- //在该位置生成要捕捉的精灵
-
- GameObject _pet = Instantiate(pets[StaticData.CatchingPetIndex], _tra.position, _tra.rotation);
-
-
-
-
- void Start () {
-
- pets = Resources.LoadAll<GameObject>("Pets");
-
- //生成精灵
-
- InsPet();
-
- }
- //储存面板
-
- public GameObject PnCatched;
-
- public void Show_PnCatched()
-
- {
-
- PnCatched.SetActive(true);
-
- }
- //延迟两秒显示捕捉面板并销毁精灵
-
- IEnumerator ShowCatchedPn()
-
- {
-
- yield return new WaitForSeconds(2f);
-
- //显示捕捉面板
-
- ARUI_Mgr.Instance.Show_PnCatched();
-
- //销毁精灵物体
-
- Destroy(transform.gameObject);
-
- }
-
- //播放被捕捉的动画
-
- private void playCatched()
-
- {
-
- transform.GetComponent<Animator>().SetTrigger("Catched");
-
- }
-
- void OnTriggerEnter(Collider other)
-
- {
-
- if (other.tag == "Avatar")//与标签为“Avatar”的物体碰撞
-
- {
-
- //显示捕捉面板
-
- UI_Mgr_02.Instance.SetIm_Catch(true);
-
- //当与角色碰撞时,更改全局变量:要捕捉的精灵序号
-
- StaticData.CatchingPetIndex = PetIndex;
-
- //销毁物体
-
- Destroy(gameObject);
-
- }
-
- if(other.tag == "Ball")
-
- {
-
- //播放动画
-
- playCatched();
-
- //显示面板
-
- ShowCatchedPn();
-
-
-
-
- }
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class PetSave{
-
- //记录精灵名字
-
- private string strName = "未命名宠物";
-
- //记录精灵模型的序号
-
- private int petIndex = 0;
-
- //精灵名字属性
-
- public string PetName
-
- {
-
- get { return strName; }
-
- set { strName = value; }
-
- }
-
- //精灵序号属性
-
- public int PetIndex
-
- {
-
- get { return petIndex; }
-
- set { petIndex = value; }
-
- }
-
-
-
-
- //构造函数
-
- public PetSave(string name, int index)
-
- {
-
- PetName = name;
-
- PetIndex = index;
-
- }
-
- }
- //申请列表储存捕捉到的精灵
-
- public static List<PetSave> PetList = new List<PetSave>();
-
- /// <summary>
-
- /// 向全局数据的精灵列表中添加精灵
-
- /// </summary>
-
- /// <param name="petSave">精灵的属性类 </param>
-
- public static void AddPet(PetSave petSave)
-
- {
-
- PetList.Add(petSave);
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class StoreInsPet : MonoBehaviour {
-
- //储存展示的位置
-
- public Transform[] Pos;
-
- //储存所有精灵预制体
-
- private GameObject[] pets;
-
-
-
-
- //储存展示的精灵
-
- private GameObject[] petsShow = new GameObject[3];
-
-
-
-
- void Awake()
-
- {
-
- pets = Resources.LoadAll<GameObject>("Pets");
-
- }
-
- // Use this for initialization
-
- void Start () {
-
- InsPet();
-
- }
-
-
-
-
- // Update is called once per frame
-
- void Update () {
-
-
-
-
- }
-
-
-
-
- public void InsPet()
-
- {
-
- // 获取精灵数量
-
- int _petNum = StaticData.PetList.Count;
-
- //如果仓库中有精灵
-
- if(_petNum > 0)
-
- {
-
- for(int i = 0; i < 3; i++)
-
- {
-
- //如果i大于了最后一个精灵的序号
-
- if (i > (_petNum - 1)) return;
-
- //储存精灵信息
-
- PetSave _petInfo = StaticData.PetList[i];
-
- //生成精灵
-
- Instantiate(pets[_petInfo.PetIndex], Pos[i].position, Pos[i].rotation);
-
-
-
-
- //获取精灵的名字
-
- string _petNm = _petInfo.PetName;
-
- //更新精灵的名字
-
- StoreUIMgr.Instance.UpdatePetNm(i, _petNm);
-
- }
-
- }
-
-
-
-
- }
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
- using UnityEngine.UI;
-
- public class StoreUIMgr : MonoBehaviour {
-
- //显示精灵名字的text
-
- public Text[] PetName;
-
- //显示精灵类型的text
-
- public Text[] PetType;
-
- //单例
-
- public static StoreUIMgr Instance;
-
-
-
-
- void Awake()
-
- {
-
- Instance = this;
-
- }
-
-
-
-
- //更新精灵的名字函数
-
- public void UpdatePetNm(int index, string strName)
-
- {
-
- PetName[index].text = strName;
-
- }
-
- }
- //跳转到仓库界面
-
- SceneManager.LoadScene("Store_Scn");
场景切换设计:
流程
- using UnityEngine.SceneManagement;
-
- //跳转到地图场景
-
- public void Btn_ToMap()
-
- {
-
- SceneManager.LoadScene("Map_Scn");
-
- }
完善
流程
- //储存相机位置
-
- public Transform CameraTra;
InsPet()中最后添加:
- //让生成的精灵面向我们
-
- _pet.transform.LookAt(new Vector3(CameraTra.position.x, _pet.transform.position.y, CameraTra.position.z));
- /// <summary>
-
- /// 刷新精灵类型函数
-
- /// </summary>
-
- /// <param name="index">精灵序号</param>
-
- /// <param name="strType">精灵类型名字</param>
-
- public void UpadatePetType(int index, string strType)
-
- {
-
- Tx_PetType[index].text = strType;
-
- }
- public static string GetPetName(int index)
-
- {
-
- if(index == 0)
-
- {
-
- return "不灭狂雷";
-
- }
-
- else if(index == 1)
-
- {
-
- return "牛头酋长";
-
- }
-
- else if (index == 2)
-
- {
-
- return "赤小兔";
-
- }
-
- else if (index == 3)
-
- {
-
- return "沙漠皇帝";
-
- }
-
- else if (index == 4)
-
- {
-
- return "乌迪尔";
-
- }
-
- else if (index == 5)
-
- {
-
- return "傲之追猎者";
-
- }
-
- else if (index == 6)
-
- {
-
- return "麻花藤";
-
- }
-
- else if (index == 7)
-
- {
-
- return "沙漠死神";
-
- }
-
- else
-
- {
-
- return "不屈之枪";
-
- }
-
-
-
-
- }
- /// <summary>
-
- /// 刷新精灵类型函数
-
- /// </summary>
-
- /// <param name="index">精灵序号</param>
-
- /// <param name="strType">精灵类型名字</param>
-
- public void UpadatePetType(int index, string strType)
-
- {
-
- Tx_PetType[index].text = strType;
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
- using UnityEngine.SceneManagement;
-
- public class Login_UI : MonoBehaviour {
-
-
-
-
- public void Login()
-
- {
-
- SceneManager.LoadScene("Map_Scn");
-
- }
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class Login_Au : MonoBehaviour {
-
-
-
-
- private AudioSource Au;
-
- //静态单例
-
- public static Login_Au Instance;
-
-
-
-
- void Awake()
-
- {
-
- Instance = this;
-
- }
-
- // Use this for initialization
-
- void Start () {
-
- Au = GetComponent<AudioSource>();
-
- }
-
-
-
-
- public void Btn_Play()
-
- {
-
- Au.Play();
-
- }
-
- }
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class Map_Au : MonoBehaviour {
-
-
-
-
- private AudioSource Au;
-
- //静态单例
-
- public static Map_Au Instance;
-
-
-
-
- void Awake()
-
- {
-
- Instance = this;
-
- }
-
- // Use this for initialization
-
- void Start()
-
- {
-
- Au = GetComponent<AudioSource>();
-
- }
-
-
-
-
- public void Btn_Play()
-
- {
-
- Au.Play();
-
- }
-
- }
-
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class Map_Au : MonoBehaviour {
-
-
-
-
- private AudioSource Au;
-
- //静态单例
-
- public static Map_Au Instance;
-
-
-
-
- void Awake()
-
- {
-
- Instance = this;
-
- }
-
- // Use this for initialization
-
- void Start()
-
- {
-
- Au = GetComponent<AudioSource>();
-
- }
-
-
-
-
- public void Btn_Play()
-
- {
-
- Au.Play();
-
- }
-
- }
-
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public class Map_Au : MonoBehaviour {
-
-
-
-
- private AudioSource Au;
-
- //静态单例
-
- public static Map_Au Instance;
-
-
-
-
- void Awake()
-
- {
-
- Instance = this;
-
- }
-
- // Use this for initialization
-
- void Start()
-
- {
-
- Au = GetComponent<AudioSource>();
-
- }
-
-
-
-
- public void Btn_Play()
-
- {
-
- Au.Play();
-
- }
-
- }
- //播放按钮声音
-
- Map_Au.Instance.Btn_Play();
- using System.Collections;
-
- using System.Collections.Generic;
-
- using UnityEngine;
-
-
-
-
- public static class SaveAndLoad{
-
- public static void Save()
-
- {
-
- //保存精灵球数量
-
- ES3.Save<int>("BallNum", StaticData.BallNum);
-
- //保存已捕捉的精灵的数量
-
- ES3.Save<int>("PetNum", StaticData.PetList.Count);
-
- //保存每一个已捕捉到的精灵信息
-
- for(int i = 0; i < StaticData.PetList.Count; i++)
-
- {
-
- //储存每一个精灵的名字
-
- ES3.Save<string>("PetName" + i.ToString(), StaticData.PetList[i].PetName);
-
- //储存每一个精灵的序号
-
- ES3.Save<int>("PetIndex" + i.ToString(), StaticData.PetList[i].PetIndex);
-
- }
-
- }
-
- //加载函数
-
- public static void Load()
-
- {
-
- if(ES3.KeyExists("BallNum") && ES3.KeyExists("PetNum"))
-
- {
-
- //读取精灵球数量
-
- StaticData.BallNum = ES3.Load<int>("BallNum");
-
- //读取精灵数量
-
- int _petNum = ES3.Load<int>("PetNum");
-
- //读取每个精灵的信息
-
- for(int i = 0; i < _petNum; i++)
-
- {
-
- string _petName = ES3.Load<string>("PetName" + i.ToString());
-
- int _petIndex = ES3.Load<int>("PetIndex" + i.ToString());
-
- StaticData.AddPet(new PetSave(_petName, _petIndex));
-
- }
-
- }
-
- }
-
-
-
-
- }
- public void Btn_Save()
-
- {
-
- Store_Au.Instance.Btn_Play();
-
- SaveAndLoad.Save();
-
- }
-
- 将加载函数加载登录的按钮函数内(在LoginUI脚本中),登录即读取
-
- public void Login()
-
- {
-
- Login_Au.Instance.Btn_Play();
-
- SaveAndLoad.Load();
-
- SceneManager.LoadScene("Map_Scn");
-
- }
登录界面:
该界面用户名密码其实并没有效果, 点击登录,会自动读取上一次的记录并跳转到地图界面
地图界面:
打开app后允许gps功能,玩家在现实世界移动,游戏世界的角色也会跟着移动,地图为学校。左上方显示精灵球和食物数量,通过点击右上角的扫描区域,可以在周围随机刷新精灵球、食物和精灵。玩家碰撞到精灵球、食物,数量会增加,碰撞到精灵弹出捕捉面板
AR战斗界面:
玩家手持手机环顾四周,寻找精灵,找到精灵后,通过滑动手指的动作来投掷精灵球,碰撞到精灵便捕捉成功,捕捉成功后显示成功面板,起名确认后跳转到仓库界面,否则跳转到地图界面
仓库界面:
玩家捕捉的精灵将显示在该界面,点击保存将会保存当前精灵,下次登录时会自动读取
在上一次实验时,我就想导出安卓包,但出现了SDK的各种问题,先是找不到SDK,然后是版本低,不能够支持最新版本的Vuforia,尝试了很多办法。最开始解决找不到SDK时,把Unity卸载了重装,但安装又出现了问题,又看博客的单独安装,就是把各种需要的模块、包、SDK等等单独下载,再整合一起,找到SDK了,但版本又不支持,于是又重新下载了最新的Unity,但最新的Unity的安卓sdk版本依旧不支持最新版本的Auforia,于是乎,便排查出不是Unity的问题,而是安卓包和Auforia版本不匹配的问题,最后又下回了Unity2020的稳定版本,导入Vuforia后,降低Vuforia的版本后能够成功导出安卓包了。但此次实验的环境是Unity2017,因为Unity2017自带Vuforia,更方便,根本不用担心安卓包和Auforia版本不匹配的问题。
MapBox以往和Vuforia是一样的,只要注册登录就可以申请密钥,使用其LBS插件的功能,但今年有所变化,注册账号必须要visa等国际银行卡,但这种银行卡不是随随便便轻而易举就能办下来的,所以正在我一筹莫展之时,MapBox一小时后还是给我发来了验证邮件,没有银行卡还是注册账号成功了。
中间有时会发生一些小bug,不过无足轻重很快就能调整好,比较麻烦的问题是最后的canvas布局问题
经过仔细查找发现是发射脚本ARShootBall只放的层级组件有问题,导致只能对第一个精灵球进行控制,第一个销毁后新生成的失效了无反应,最后通过将脚本挂载到精灵器预制体上顺利解决。
导到手机上测试时,发现仓库界面的精灵信息面板发生重叠,发现是分辨率的不同导致的,电脑上设置的分辨率是1080*1920,而我的手机估计是10:21的比例,所以有所不同,于是查阅博客对canvas scaler的描述,更改canvas scaler的UI Scale Mode为 Scale With Screen Size,并根据情况更改Match即可,像上面这个,宽度其实不用缩放,只需要根据手机的高度来缩放UI的高度即可,因此Match拉到1。
本项目的技术难点不算多,大多学习到的是项目的管理和游戏基本功能在Unity中的实现。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。