当前位置:   article > 正文

unity蜘蛛小游戏(有一些残缺)_unity做蜘蛛侠吐丝功能

unity做蜘蛛侠吐丝功能

一、实现人物的移动

首先创建相机(新建场景都会有),在相机下边把这个手枪的模型拖过去,对比着摄像机里边的视角,找到一个合适的位置。

控制角色移动
1、在Hierarchy视图中选择Create->Create Empty创建一个空的游戏体,并将他命名为Player。
2、选中Player游戏体之后,在菜单栏上选择Component->Physics->CharacterController给Player游戏体添加角色控制组件。
3、设置Player的CharacterController组件中的Center属性。调整y值为1

完整的Player.cs代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Player : MonoBehaviour
  5. {
  6. //角色获取Player的Transform组件
  7. public Transform m_tranform;
  8. //角色的移动速度
  9. public float m_speed = 3.0f;
  10. //重力
  11. public float m_gravity = 2.0f;
  12. //用来获取角色控制组件
  13. CharacterController m_chaController;
  14. //用于获取摄像机tranform组件
  15. public Transform m_camTransform;
  16. //用于获取摄像机的角度
  17. Vector3 m_camRot;
  18. //用于控制摄像机的高度
  19. float m_camHigh = 1.4f;
  20. void Start()
  21. {
  22. m_tranform = this.transform;
  23. //m_audio = GetComponent<AudioSource>();
  24. m_chaController = GetComponent<CharacterController>();
  25. //获取主摄像机的transform组件
  26. m_camTransform = Camera.main.transform;
  27. m_camTransform.position = m_tranform.TransformPoint(0, m_camHigh, 0);
  28. m_camTransform.rotation = m_tranform.rotation;
  29. m_camRot = m_tranform.eulerAngles;
  30. //锁定鼠标
  31. Cursor.lockState = CursorLockMode.Locked;
  32. }
  33. // Update is called once per frame
  34. void Update()
  35. {
  36. Control();
  37. }
  38. //用来控制角色移动
  39. void Control()
  40. {
  41. //控制主角移动代码
  42. Vector3 moveTo = Vector3.zero;
  43. moveTo.x = Input.GetAxis("Horizontal") * Time.deltaTime * m_speed;
  44. moveTo.z = Input.GetAxis("Vertical") * Time.deltaTime * m_speed;
  45. moveTo.y -= m_gravity * Time.deltaTime;
  46. m_chaController.Move(m_tranform.TransformDirection(moveTo));
  47. //控制摄像机代码
  48. float rh = Input.GetAxis("Mouse X");
  49. float rv = Input.GetAxis("Mouse Y");
  50. m_camRot.x -= rv;
  51. m_camRot.y += rh;
  52. m_camTransform.eulerAngles = m_camRot; //旋转摄像机
  53. Vector3 camrot = m_camTransform.eulerAngles;
  54. camrot.x = 0;
  55. camrot.z = 0;
  56. m_tranform.eulerAngles = camrot; //仅仅只需要让主角的面朝向相机的方向就行了,不用旋转别的方向
  57. //保持主角摄像机在上方
  58. m_camTransform.position = transform.TransformPoint(0, m_camHigh, 0);
  59. }
  60. }

 我们把代码挂载在之前创建的空物体上边,可以为空物体命名为Player,然后挂载上脚本之后我们把脚本所在的物体和摄像机拖到脚本上边。

如下图所示: 

这样我们可以运行看一下,可以进行移动了,手枪的位置也是可以的。我们接着往下来

二、场景中设置多个出生点生成蜘蛛

在这里我们需要用到生成物体这个脚本,如下:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.AI;
  5. public class suijishengcheng : MonoBehaviour
  6. {
  7. // 在场景中设置多个出生点
  8. public Transform[] spawnPoints;
  9. // 蜘蛛预制体
  10. public GameObject spiderPrefab;
  11. void Start()
  12. {
  13. // 每隔一定时间生成一个蜘蛛
  14. InvokeRepeating("SpawnSpider", 0f, 5f);
  15. }
  16. void SpawnSpider()
  17. {
  18. // 随机选择一个出生点
  19. int index = Random.Range(0, spawnPoints.Length);
  20. Transform spawnPoint = spawnPoints[index];
  21. // 生成蜘蛛
  22. GameObject spider = Instantiate(spiderPrefab, spawnPoint.position, spawnPoint.rotation);
  23. }
  24. }

我们新建一个空物体命名为Gamemanager把上边这个脚本挂载上去。

找到蜘蛛的位置,把蜘蛛拖到脚本上边

按照下边增加蜘蛛生成的位置,新建空物体,拖到脚本上边。

 

 

 三、蜘蛛移动

增加寻路系统

 

在很多游戏中,敌人经常要在复杂的地形中追着主角跑,因为场景中存在很多障碍物,所以敌人的AI要足够聪明,才能找出到达目标点的最近道路,且绕开障碍物。写一个完善的寻路算法是比较有挑战性的,特别是在复杂的3D场景中,好在Unity提供了一个非常实用的寻路功能,只需要较少的代码即可实现复杂的寻路功能。

下面我将给大家介绍如何去具体实现这个功能:

Unity的寻路系统分为两部分:
(1)一部分是对场景进行设置, 使其满足寻路算法的需求;
(2)设置寻路者。

1. 步骤一
选择除敌人和Player以外的所有场景模型,然后单击Inspcetor窗口Static 旁边的小三角形按钮显示出下拉列表,确认[Navigton Satic]被选中,Unity 将指导这样的模型用于寻路计算,如图所示

2.步骤二
在菜单栏中选择[ Window] -> [Navigation],打开Navigation窗口,如图所示。 

在这里我们可以看见整个地形,除了障碍都被覆盖上了颜色,这里就是Unity帮我们计算地形上的障碍,来指导敌人模型用来自动寻路,如果场景里存在有没有勾选[Navigton Satic]的模型,即使它在场景里面,Unity也会默认他不在场景中来对人物进行自动寻路

打开Navigation窗口后,在Navigation面板下找到Bake,其面板如下: 

Bake窗口主要是定义地形对寻路的影响:
●Agent Radius和Height可以理解为寻路者的半径和高度。
●Max Slope是最大坡度,超过这个坡度寻路者则无法通过。
●Step Height是楼梯的最大高度,超过这个高度寻路者则无法通过。
●DropHeight表示寻路者可以跳落的高度极限。
●Jump Distance表示寻路者的跳跃距离极限。

大家可以根据自己的需求进行适当修改

3.步骤三
在Navigation窗口中设置好选项后,单击[Bake]按钮对地形进行计算(如果场景比较多,那计算的时间会稍微长一点,进度可以看右下角的进度条,待烘焙完成后再进行下一步操作),单击[Clear]按钮会清除计算结果。Bake出来的寻路数据,会被保存为一个文件,名为NavMesh.asset,当前关卡相关联,这一点与Lightmap很像。

接下来设置寻路者,也就是游戏中的敌人

4.步骤四
将自己准备好的敌人模型拖入场景中,这个我们上边已经把蜘蛛拖到场景里边了

5.步骤五
在菜单栏中选择[Component]一[Nav Mesh Agent],将寻路组件指定给敌人。然后在Inspector窗口中进行进一步的设置, Speed 是最大运动速度,Angular Speed 是最大旋转速度,如图[5-1]所示。在Agent Type中选择[Open Agent Settings], 可以打Navigation的Agents窗口,设置Radius和Height,表示寻路者的半径和高度,如图所示

 

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.AI;
  5. public class AI : MonoBehaviour
  6. {
  7. private Transform target; //设置追踪目标的位置
  8. public float MoveSpeed=2.5f; //敌人移动速度
  9. private NavMeshAgent navMeshAgent; //设置寻路组件
  10. void Start()
  11. {
  12. target = GameObject.FindWithTag("Player").transform; //获取游戏中主角的位置,在我的工程里面主角的标签是Player
  13. navMeshAgent = GetComponent<NavMeshAgent>();
  14. navMeshAgent.speed = MoveSpeed; //设置寻路器的行走速度
  15. if (navMeshAgent == null)
  16. {
  17. navMeshAgent = gameObject.AddComponent<NavMeshAgent>();
  18. }
  19. }
  20. void Update()
  21. {
  22. navMeshAgent.SetDestination(target.transform.position); //设置寻路目标
  23. }
  24. }

 这是敌人的脚本。在Sart函数中获得NaMesAgen组件,然后调用SeDestination函数设置一个目标点,即可自动追击主角。如果希望自行控制移动,可以使用CalculatePath函数计算出路径,然后按路径节点移动。

7.步骤七
将脚本AI给指定敌人,运行游戏,敌人会找出最短路径向主角位置前进。

四、进行手枪射击然后实现蜘蛛的死亡

1、进行手枪射击

首先,我们准备好一把枪的模型,将其放到场景中,调整好位置。(这个上边已经进行调整过了)

第二,我们在枪口前面一点的位置创建一个空物体,作为发射口,调整好位置(注意:发射器位置不要和枪身太近)

第三,制作简易子弹,这里我们使用胶囊体,改变一下大小和旋转调度就可以了。(注:这里的参数仅供参考,另外可以加材质球使其变个色) 

第四、实例化生成子弹。现在,我们将制作好的子弹做成预制体,并在枪发射器上新建一个脚本。(注意:发射器的Rotation要和子弹的保持一致) 

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class GunShoot : MonoBehaviour
  5. {
  6. public GameObject bulletPrefab; //子弹预制体
  7. void Update()
  8. {
  9. Shoot();
  10. }
  11. void Shoot()
  12. {
  13. if (Input.GetKeyDown(KeyCode.Space)) //如果按下空格键,生成预制体
  14. {
  15. Instantiate(bulletPrefab, transform.position, transform.rotation); //生成预制体
  16. }
  17. }
  18. }

 写好后不要忘记将子弹的预制体拖到脚本里。现在,我们已经可以通过按下空格键,来生成一枚子弹啦,只是还不能将其发射出去

第五、我们给子弹再新建一个脚本,让其具有移动功能。

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Bullet : MonoBehaviour {
  5. public float speed = 8f; //子弹速度
  6. void Start () {
  7. Destroy(gameObject, 7f); //7s后销毁自身
  8. }
  9. void Update () {
  10. transform.Translate(0, Time.deltaTime * speed, 0); //子弹位移
  11. }
  12. }

如果枪口发射的位置不对就掉一下发射位置的旋转 ,子弹大小也可以调节。如果想要加上音效可以加到子弹预制体上边

下边进行蜘蛛动画的添加

 

 把蜘蛛动画拖动进去

添加Trigger

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/104031
推荐阅读
相关标签
  

闽ICP备14008679号