射击类游戏--射击辅助线的实现

超、凢脫俗 2022-02-03 16:11 500阅读 0赞

最近在项目中碰到一个问题,炮台再射击物体的时候,要生成一个炮台和目标的辅助线。类似于捕鱼类游戏,在锁定目标的情况下,生成的辅助线。

因为项目是3D的,所以在生成这个辅助线的时候,思考了一个下午,才得以实现。效果如下图:

20190509203231305.gif

移动的Cube为锁定的目标,不懂得Cube为射击点。小球 为辅助线。

通过计算射击点和目标的距离,来计算得到应该生成的小球个数,每次改变物体的位置,重新计算小球个数,少的小球,生成放到对应位置,多的小球销毁。该示例在X轴和Z轴正半轴组成的平面有效。

初次生成辅助线代码:

  1. if (angle>90)
  2. {
  3. angle = 180 - angle;
  4. num = Mathf.Floor(dis / 3);
  5. for (int i = 0; i < num; i++)
  6. {
  7. float x = oriPoint.position.x - 3 * (i + 1) * Mathf.Cos(Mathf.Deg2Rad * angle);
  8. float z = oriPoint.position.z + 3 * (i + 1) * Mathf.Sin(angle * Mathf.Deg2Rad);
  9. GameObject obj = Instantiate(_prefab, new Vector3(x, 0, z), Quaternion.identity);
  10. obj.transform.SetParent(_parent);
  11. SubLineList.Add(obj);
  12. }
  13. }
  14. else
  15. {
  16. num = Mathf.Floor(dis / 3);
  17. for (int i = 0; i < num; i++)
  18. {
  19. float x = 3 * (i + 1) * Mathf.Cos(Mathf.Deg2Rad * angle) + oriPoint.position.x;
  20. float z = 3 * (i + 1) * Mathf.Sin(angle * Mathf.Deg2Rad) + oriPoint.position.z;
  21. GameObject obj = Instantiate(_prefab, new Vector3(x, 0, z), Quaternion.identity);
  22. obj.transform.SetParent(_parent);
  23. SubLineList.Add(obj);
  24. }
  25. }

目标移动后的处理:

  1. if (num < Mathf.Floor(dis / 3))
  2. {
  3. float NowAngle= Vector3.Angle(endPoint.position - oriPoint.position, Vector3.right);
  4. if (NowAngle>90)
  5. {
  6. NowAngle = 180 - NowAngle;
  7. for (float i = num; i < Mathf.Floor(dis / 3); i++)
  8. {
  9. float x = oriPoint.position.x - 3 * (i + 1) * Mathf.Cos(Mathf.Deg2Rad * NowAngle);
  10. float z = oriPoint.position.z + 3 * (i + 1) * Mathf.Sin(NowAngle * Mathf.Deg2Rad);
  11. GameObject obj = Instantiate(_prefab, new Vector3(x, 0, z), Quaternion.identity);
  12. obj.transform.SetParent(_parent);
  13. SubLineList.Add(obj);
  14. }
  15. }
  16. else
  17. {
  18. for (float i = num; i < Mathf.Floor(dis / 3); i++)
  19. {
  20. float x = 3 * (i + 1) * Mathf.Cos(Mathf.Deg2Rad * NowAngle) + oriPoint.position.x;
  21. float z = 3 * (i + 1) * Mathf.Sin(NowAngle * Mathf.Deg2Rad) + oriPoint.position.z;
  22. GameObject obj = Instantiate(_prefab, new Vector3(x, 0, z), Quaternion.identity);
  23. obj.transform.SetParent(_parent);
  24. SubLineList.Add(obj);
  25. }
  26. }
  27. num = Mathf.Floor(dis / 3);
  28. }
  29. if (num > Mathf.Floor(dis / 3))
  30. {
  31. Debug.Log("Num:" + num + " Other:" + Mathf.Floor(dis / 3));
  32. //销毁
  33. for (int i = 0; i < num-Mathf.Floor(dis/3); i++)
  34. {
  35. Destroy(SubLineList[SubLineList.Count - 1]);
  36. SubLineList.RemoveAt(SubLineList.Count - 1);
  37. }
  38. num = Mathf.Floor(dis / 3);
  39. }
  40. }

具体Demo:https://download.csdn.net/download/hnzmdlhc/11170156

发表评论

表情:
评论列表 (有 0 条评论,500人围观)

还没有评论,来说两句吧...

相关阅读

    相关 unity制作FPS射击游戏

    文章目录 介绍 鼠标移动控制视角 行走、奔跑、跳跃、下蹲 射击、后坐力、射速、瞄准、弹痕、枪火、抛壳 手臂摇摆 手枪 切枪效果

    相关 Shooter射击游戏需求分析

    Vision 随着智能手机的快速普及,智能手机操作系统市场风生水起。为了让智能手机用户能够随时随地娱乐生活、放松身心,一种高效的办法就是将应用系统的功能拓展到手机终端上。因此