经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
Fire Balls 09——修正游戏的BUG
来源:cnblogs  作者:优梦创客  时间:2019/9/11 10:31:51  对本文有异议

版权申明:

  • 本文原创首发于以下网站:
  1. 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
  2. 优梦创客的官方博客:https://91make.top
  3. 优梦创客的游戏讲堂:https://91make.ke.qq.com
  4. 『优梦创客』的微信公众号:umaketop
  • 您可以自由转载,但必须加入完整的版权声明

目标

  • Tower的Cylinder的放大,防止先打到砖块
  • 场景的调色
  • 命中后子弹消失
  • Tank的调整
  • 砖块淡出禁用碰撞体
  • Tower没有上升完毕禁止射击

    Tower的Cylinder的放大

  • 把我们的Cylinder放大至合适的大小(比砖块大一些)即可;

场景的调色

  • 首先在我们的场景上找到太阳光(Directional Light)并把颜色参数设置为如下所示:

命中后子弹消失

  • 打开我们的Projectile脚本,找到碰撞发生函数,并添加如下代码
  1. private void OnCollisionEnter(Collision collision)
  2. {
  3. if(collision.gameObject.tag == "Tower")
  4. {
  5. Destroy(gameObject);
  6. collision.transform.parent.GetComponent<Tower>().DropTower();
  7. }
  8. if(collision.gameObject.tag == "Arch")
  9. {
  10. lober.endPos = player.transform.position;
  11. lober.enabled = true;
  12. player.gameover = true;
  13. Destroy(gameObject, 1.5f);
  14. }
  15. }

Tank的调整

  • 打开我们的Level1预制体找到我们的Tank把Tank拖到Level1的子节点,也就是和平台是同一节点即可

砖块淡出禁用碰撞体

  • 首先打开我们的方块预制体和圆柱预制体把里面的碰撞体Collider都更改为MeshCollider。
  • 打开我们的Bricks脚本找到setFadeout函数添加如下代码即可:
  1. internal void setFadeout()
  2. {
  3. isFadeout = true;
  4. GetComponent<MeshCollider>().enabled = false;
  5. }

Tower没有上升完毕禁止射击

  • 打开Tank脚本增加一个Bool变量名为isMovingUp然后在Update函数里编写如下代码
  1. void Update()
  2. {
  3. if (gameover)
  4. return;
  5. if (Input.GetButtonDown("Fire1"))
  6. {
  7. pressTime = Time.time;
  8. }
  9. if (isMovingUp)
  10. return;
  11. if (Input.GetButton("Fire1")&&Time.time - lastFireTime>0.2f)
  12. {
  13. //每一帧计算当前时间-按下时间之差d
  14. float d = Time.time - pressTime;
  15. //实例化一个子弹;
  16. var transProj = Instantiate(Bullet).transform;
  17. float f = d / 2;//最大2秒内有变化,超过2秒使用最高音高系数(1)
  18. if (f > 1)
  19. {
  20. f = 1;
  21. }
  22. transProj.GetComponent<AudioSource>().pitch = 1 + f * 2;
  23. //设置子弹的父节点;
  24. transProj.SetParent(transform, false);
  25. //设置子弹的坐标;
  26. transProj.position = ShotPos.position;
  27. //给子弹一个力,可以让子弹往前移动;
  28. Vector3 v = ShotPos.forward * 20;
  29. transProj.GetComponent<Rigidbody>().AddForce(v, ForceMode.Impulse);
  30. lastFireTime = Time.time;
  31. }
  32. }
  • 打开我们的Tower脚本编写如下代码即可。
  1. public class Tower : MonoBehaviour
  2. {
  3. public int Height;
  4. public Color[] Colors = new Color[2];
  5. public GameObject brickPrefab;
  6. public List<GameObject> bricks = new List<GameObject>();
  7. public bool isRisenUp = false;//砖块是不是全部从地下钻上来了
  8. public Tank tank;
  9. // Start is called before the first frame update
  10. void Start()
  11. {
  12. tank = GameObject.Find("Player").GetComponent<Tank>();
  13. for(int i = 0; i < Height; i++)
  14. {
  15. GameObject goBrick = Instantiate(brickPrefab);
  16. goBrick.transform.SetParent(transform,false );
  17. goBrick.transform.Translate(0, i, 0,Space.Self);
  18. goBrick.GetComponent<MeshRenderer>().material.color = Colors[i % 2];
  19. goBrick.transform.Rotate(0, i*10, 0,Space.Self);
  20. bricks.Add(goBrick);
  21. }
  22. StartCoroutine(RiseUpFormUnderground());
  23. }
  24. IEnumerator RiseUpFormUnderground()
  25. {
  26. transform.Translate(0, -Height * transform.lossyScale.y, 0, Space.Self);
  27. while (transform.position.y<0.8*transform.lossyScale.y)
  28. {
  29. transform.Translate(0, 5 * Time.deltaTime, 0, Space.Self);
  30. yield return null;
  31. }
  32. isRisenUp = true;
  33. tank.isMovingUp = false;
  34. }
  35. // Update is called once per frame
  36. }

原文链接:http://www.cnblogs.com/raymondking123/p/11504442.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号