当前位置: 首页 > news >正文

珠海仿站定制模板建站推广普通话写好规范字手抄报

珠海仿站定制模板建站,推广普通话写好规范字手抄报,成都网站定制,网站使用的主色调unity开发微信跳一跳 目录 建立项目 准备人物、地板、小方块 实现摄像头跟随 实现地板移动 实现小方块自动生成 实现小人跳动 实现小人伸缩 实现小方块自动销毁 实现小方块随机大小和随机颜色 实现分数显示 实现跌落重玩 player完整脚本 建立项目 简单实现一下微信…

unity开发微信跳一跳

目录

建立项目

准备人物、地板、小方块

实现摄像头跟随

实现地板移动

实现小方块自动生成

实现小人跳动

实现小人伸缩

实现小方块自动销毁

实现小方块随机大小和随机颜色

实现分数显示

实现跌落重玩

player完整脚本


建立项目

简单实现一下微信跳一跳小游戏,打包成安卓安装包放手机上玩。

首先建一个3D空项目,要记住项目名称不能有中文、空格、特殊字符(别问我是怎么知道的T_T)。

准备人物、地板、小方块

然后先建个小人出来,弄个player,给他两个子对象,一个球体当头,一个圆柱体当身子。

 可以搞个材料上色,没有颜色也没关系,我一开始先不管,颜色是后面添加材料有的。

再整块Plane当地板,一定要足够大。

最后弄个cube小方块当平台让小人站在上面。

然后我们的东西就基本准备好了。

实现摄像头跟随

我们的主人公是会跳的,所以我们必须让我们的摄像头跟着小人一起跑。

首先手动给摄像头寻找最好的参数视角:

然后写个脚本挂在摄像头上,就让它以我们刚刚找好的偏移时刻跟着我们的player跑。

using UnityEngine;public class follow_player : MonoBehaviour
{public Transform player;public Vector3 offset;private void FixedUpdate(){transform.position = player.position + offset;}
}

记得把我们的player拉到这里,还有设置好偏移:

实现地板移动

同样的道理,我们的地板也要跟着小人一起移动,为什么呢?因为地板是有大小限制的,小人不停的跑是有可能会跑出边界的,所以我们要让地板一起走。

给地板挂个脚本:

using UnityEngine;public class Ground : MonoBehaviour
{public Transform player;// Update is called once per framevoid Update(){var position = player.position;transform.position = new Vector3(position.x, 0, position.z);}
}

有同学可能会问了,那地板跑了,小方块不也跑了?

有道理,但是不给他摩擦力他怎么跑@_@。

实现小方块自动生成

我们要让小人跳到一块小方块就自动生成下一块小方块,写个脚本,为了方便后面脚本都统一挂在小人身上,除了小方块的随机大小和颜色,这个我们后面再说。

我们写一个自动生成小方块的函数,当然在此之前我们先把小方块拖进Asset里面整成预制件。

由于我们的跳一跳是只有两个方向的,所以我们先随机一个方向出来,然后分情况生成,对于位置,我们需要记录前一个小方块的位置,然后在此之上做偏移。

    private void NewCube(){var random = new System.Random();direction = random.Next(0, 2);if (direction == 0){var cube = Instantiate(cubePrefab, new Vector3(Random.Range(10, 13), 0, 0) + cubePlace,Quaternion.identity);cubePlace = cube.transform.position;cubes.Enqueue(cube);}else{var cube = Instantiate(cubePrefab, new Vector3(0, 0, Random.Range(10, 13)) + cubePlace,Quaternion.identity);cubePlace = cube.transform.position;cubes.Enqueue(cube);}if (cubes.Count > maxCubeNumber){var cube = cubes.Dequeue();Destroy(cube);}}

当然你会发现这里多了个队列,这个我们后面销毁小方块会用到。

实现小人跳动

这里是最关键的地方,也是bug最多的地方。

首先简单来说,我们需要记录触摸手机屏幕的时间作为小人冲量的大小。

根据二八原则,80%的代码是为了解决bug出现的,20%的代码就可实现简单功能。

在这里我们只讲那实现简单功能的20%代码,剩下的80%靠大家领悟。

            var touch = Input.touches[0];if (touch.phase == TouchPhase.Began){start = Time.time;}else if (touch.phase == TouchPhase.Ended){var time = Time.time - start;if (direction == 0){playerRigidbody.AddForce(new Vector3(1, 1, 0) * (time * speed), ForceMode.Impulse);}else{playerRigidbody.AddForce(new Vector3(0, 1, 1) * (time * speed), ForceMode.Impulse);}}

到此,本游戏基本功能基本实现,下面是继续完善版。 

实现小人伸缩

我要的效果就是我摁下去他就变矮变胖。

同时矮了一半了就不能再矮了,跳也不能跳太远,至于不能跳太近是因为那样会引发某个bug,我的解决办法就是当无法解决bug的时候就去禁止导致bug的行为,还有就是在空中飞的时候不能再跳了。

在原来代码的基础上丰富:

        if (Input.touchCount > 0 && inTheAir == false){jump = true;if (body.transform.localScale.y > 0.5){body.transform.localScale += new Vector3(1, -1, 1) * (0.45f * Time.deltaTime);head.transform.localPosition += new Vector3(0, -1, 0) * (0.45f * Time.deltaTime);}var touch = Input.touches[0];if (touch.phase == TouchPhase.Began){start = Time.time;}else if (touch.phase == TouchPhase.Ended){var time = Time.time - start;if (time > 3){time = 3;}else if (time < 0.5f){time = 0.5f;}if (direction == 0){playerRigidbody.AddForce(new Vector3(1, 1, 0) * (time * speed), ForceMode.Impulse);}else{playerRigidbody.AddForce(new Vector3(0, 1, 1) * (time * speed), ForceMode.Impulse);}body.transform.localScale = new Vector3(1, 1.5f, 1);head.transform.localPosition = new Vector3(0, 3.7f, 0);inTheAir = true;}}

实现小方块自动销毁

用过了的就没有利用价值,特别是在视野范围内都看不到你的时候。

我们通过维持一个小方块队列,当队列数量超过一定数目时,销毁队首小方块。

        if (cubes.Count > maxCubeNumber){var cube = cubes.Dequeue();Destroy(cube);}

后期测试的时候发现一个问题,那就是会把第一个预制件销毁,导致后面无法生成小方块,因此需要解脱第一个小方块预制件的身份,让它成为一个普通的克隆件。

实现小方块随机大小和随机颜色

给它挂个小脚本:

using UnityEngine;public class Cube : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){GetComponent<Renderer>().material.color = new Color(Random.value, Random.value, Random.value);var radius = Random.Range(4, 7);transform.localScale = new Vector3(radius,Random.Range(4,7),radius);}
}

实现分数显示

整一个Canvas,添加一个text

 把text的位置整到左上角

在player的脚本上添加text脚本,时刻更新text:

        scoreText.text = score.ToString();

实现跌落重玩

添加碰撞检测代码,如果碰到地板或者跳了但是还在原来的小方块,重新开始:

    private void OnCollisionEnter(Collision other){if (other.gameObject.CompareTag("Ground") || other.gameObject == currentCube && jump){// FindObjectOfType<GameManager>().EndGame();SceneManager.LoadScene("MainScene");}else if (other.gameObject != currentCube){score += 1;inTheAir = false;NewCube();currentCube = other.gameObject;}}

player完整脚本

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;public class Play : MonoBehaviour
{public Rigidbody playerRigidbody;public GameObject body;public GameObject head;public GameObject cubePrefab;public Vector3 cubePlace;private Queue<GameObject> cubes = new Queue<GameObject>();public int speed = 10;public int direction = 0;public int maxCubeNumber = 10;public Transform massCenter;public GameObject currentCube;public Text scoreText;public int score = 1;private bool jump = false;private bool inTheAir = false;private float start = 0;// Start is called before the first frame updatevoid Start(){var cube = Instantiate(cubePrefab, cubePlace, Quaternion.identity);cubes.Enqueue(currentCube);cubes.Enqueue(cube);GetComponent<Rigidbody>().centerOfMass = massCenter.localPosition;}private void FixedUpdate(){if (Input.touchCount > 0 && inTheAir == false){jump = true;if (body.transform.localScale.y > 0.5){body.transform.localScale += new Vector3(1, -1, 1) * (0.45f * Time.deltaTime);head.transform.localPosition += new Vector3(0, -1, 0) * (0.45f * Time.deltaTime);}var touch = Input.touches[0];if (touch.phase == TouchPhase.Began){start = Time.time;}else if (touch.phase == TouchPhase.Ended){var time = Time.time - start;if (time > 3){time = 3;}else if (time < 0.5f){time = 0.5f;}if (direction == 0){playerRigidbody.AddForce(new Vector3(1, 1, 0) * (time * speed), ForceMode.Impulse);}else{playerRigidbody.AddForce(new Vector3(0, 1, 1) * (time * speed), ForceMode.Impulse);}body.transform.localScale = new Vector3(1, 1.5f, 1);head.transform.localPosition = new Vector3(0, 3.7f, 0);inTheAir = true;}}scoreText.text = score.ToString();}private void NewCube(){var random = new System.Random();direction = random.Next(0, 2);if (direction == 0){var cube = Instantiate(cubePrefab, new Vector3(Random.Range(10, 13), 0, 0) + cubePlace,Quaternion.identity);cubePlace = cube.transform.position;cubes.Enqueue(cube);}else{var cube = Instantiate(cubePrefab, new Vector3(0, 0, Random.Range(10, 13)) + cubePlace,Quaternion.identity);cubePlace = cube.transform.position;cubes.Enqueue(cube);}if (cubes.Count > maxCubeNumber){var cube = cubes.Dequeue();Destroy(cube);}}private void OnCollisionEnter(Collision other){if (other.gameObject.CompareTag("Ground") || other.gameObject == currentCube && jump){// FindObjectOfType<GameManager>().EndGame();SceneManager.LoadScene("MainScene");}else if (other.gameObject != currentCube){score += 1;inTheAir = false;NewCube();currentCube = other.gameObject;}}
}

还有一些bug,欢迎发现,解决更好。

http://www.yayakq.cn/news/916927/

相关文章:

  • 海外学校网站建设wordpress vue模板
  • 网站建设公司兴田德润i优惠吗jrs直播(无插件)直播极速体育360
  • 对于网站开发有什么要求在线教育网站html模板
  • 外贸设计网站沈阳百度快照优化公司
  • 北京网站开发网站建设价格百度做广告
  • 列举五种常用的网站推广方法沈阳网站优化哪家好
  • 鲜花网站开发与设计景观设计公司资质
  • 网站备案号怎么申请哈尔滨服务好的建站
  • 湖北大网站建设大型网站稳定性建设视频课程
  • 企业网站的制作公司东阳网站建设公司
  • 返利网站程序朝阳区建网站公司有帮云
  • 江西建设监督网新网站dw网站建设的常用技术
  • 网站报价单模板国家关于网站信息建设管理文件
  • 湖州网站建设官网做网站在哪里做
  • 制作网站 优帮云徐州公司网站建设
  • 西湖区商城网站建设外贸网站建设推广公司
  • 建设网站的市场环境怎么样常用的网页开发技术有哪些
  • 网站icp备案深圳网站制作哪家便宜
  • 网站建设代码生成器网站建设中英语
  • 南阳高端网站建设沈阳男科医院收费标准
  • 租赁商城手机网站开发南京网站搭建公司
  • wordpress图片添加字体网站优化建设桂林
  • 阿里网站seo制作免费个人网站
  • 国内大的网站建设公司排名WordPress小程序小白教程
  • 做网站充值犯法吗平台运营是做什么的
  • 建设网站纳什么税上街做网站
  • 龙口网站建设哪家好中山网站建设备案
  • 网站建设sem账户搭建不会编程能做网站吗
  • 江西省城乡建设厅网站查询证件seo什么职位
  • phpcms 投资 网站源码网络营销推广方案总结