赞
踩
首先创建相机(新建场景都会有),在相机下边把这个手枪的模型拖过去,对比着摄像机里边的视角,找到一个合适的位置。
控制角色移动
1、在Hierarchy视图中选择Create->Create Empty创建一个空的游戏体,并将他命名为Player。
2、选中Player游戏体之后,在菜单栏上选择Component->Physics->CharacterController给Player游戏体添加角色控制组件。
3、设置Player的CharacterController组件中的Center属性。调整y值为1
完整的Player.cs代码
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class Player : MonoBehaviour
- {
-
- //角色获取Player的Transform组件
- public Transform m_tranform;
- //角色的移动速度
- public float m_speed = 3.0f;
- //重力
- public float m_gravity = 2.0f;
- //用来获取角色控制组件
- CharacterController m_chaController;
- //用于获取摄像机tranform组件
- public Transform m_camTransform;
- //用于获取摄像机的角度
- Vector3 m_camRot;
- //用于控制摄像机的高度
- float m_camHigh = 1.4f;
- void Start()
- {
- m_tranform = this.transform;
- //m_audio = GetComponent<AudioSource>();
- m_chaController = GetComponent<CharacterController>();
-
- //获取主摄像机的transform组件
- m_camTransform = Camera.main.transform;
- m_camTransform.position = m_tranform.TransformPoint(0, m_camHigh, 0);
- m_camTransform.rotation = m_tranform.rotation;
- m_camRot = m_tranform.eulerAngles;
- //锁定鼠标
- Cursor.lockState = CursorLockMode.Locked;
- }
- // Update is called once per frame
- void Update()
- {
- Control();
- }
- //用来控制角色移动
- void Control()
- {
- //控制主角移动代码
- Vector3 moveTo = Vector3.zero;
- moveTo.x = Input.GetAxis("Horizontal") * Time.deltaTime * m_speed;
- moveTo.z = Input.GetAxis("Vertical") * Time.deltaTime * m_speed;
- moveTo.y -= m_gravity * Time.deltaTime;
-
- m_chaController.Move(m_tranform.TransformDirection(moveTo));
- //控制摄像机代码
- float rh = Input.GetAxis("Mouse X");
- float rv = Input.GetAxis("Mouse Y");
-
- m_camRot.x -= rv;
- m_camRot.y += rh;
- m_camTransform.eulerAngles = m_camRot; //旋转摄像机
-
- Vector3 camrot = m_camTransform.eulerAngles;
- camrot.x = 0;
- camrot.z = 0;
- m_tranform.eulerAngles = camrot; //仅仅只需要让主角的面朝向相机的方向就行了,不用旋转别的方向
-
- //保持主角摄像机在上方
- m_camTransform.position = transform.TransformPoint(0, m_camHigh, 0);
- }
- }
-
我们把代码挂载在之前创建的空物体上边,可以为空物体命名为Player,然后挂载上脚本之后我们把脚本所在的物体和摄像机拖到脚本上边。
如下图所示:
这样我们可以运行看一下,可以进行移动了,手枪的位置也是可以的。我们接着往下来
在这里我们需要用到生成物体这个脚本,如下:
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.AI;
-
- public class suijishengcheng : MonoBehaviour
- {
- // 在场景中设置多个出生点
- public Transform[] spawnPoints;
-
- // 蜘蛛预制体
- public GameObject spiderPrefab;
-
- void Start()
- {
- // 每隔一定时间生成一个蜘蛛
- InvokeRepeating("SpawnSpider", 0f, 5f);
- }
-
- void SpawnSpider()
- {
- // 随机选择一个出生点
- int index = Random.Range(0, spawnPoints.Length);
- Transform spawnPoint = spawnPoints[index];
-
- // 生成蜘蛛
- GameObject spider = Instantiate(spiderPrefab, spawnPoint.position, spawnPoint.rotation);
-
- }
- }
我们新建一个空物体命名为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,表示寻路者的半径和高度,如图所示
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.AI;
-
- public class AI : MonoBehaviour
- {
- private Transform target; //设置追踪目标的位置
- public float MoveSpeed=2.5f; //敌人移动速度
- private NavMeshAgent navMeshAgent; //设置寻路组件
-
- void Start()
- {
- target = GameObject.FindWithTag("Player").transform; //获取游戏中主角的位置,在我的工程里面主角的标签是Player
- navMeshAgent = GetComponent<NavMeshAgent>();
- navMeshAgent.speed = MoveSpeed; //设置寻路器的行走速度
- if (navMeshAgent == null)
- {
- navMeshAgent = gameObject.AddComponent<NavMeshAgent>();
- }
- }
-
-
- void Update()
- {
- navMeshAgent.SetDestination(target.transform.position); //设置寻路目标
- }
- }
这是敌人的脚本。在Sart函数中获得NaMesAgen组件,然后调用SeDestination函数设置一个目标点,即可自动追击主角。如果希望自行控制移动,可以使用CalculatePath函数计算出路径,然后按路径节点移动。
7.步骤七
将脚本AI给指定敌人,运行游戏,敌人会找出最短路径向主角位置前进。
1、进行手枪射击
首先,我们准备好一把枪的模型,将其放到场景中,调整好位置。(这个上边已经进行调整过了)
第二,我们在枪口前面一点的位置创建一个空物体,作为发射口,调整好位置(注意:发射器位置不要和枪身太近)
第三,制作简易子弹,这里我们使用胶囊体,改变一下大小和旋转调度就可以了。(注:这里的参数仅供参考,另外可以加材质球使其变个色)
第四、实例化生成子弹。现在,我们将制作好的子弹做成预制体,并在枪发射器上新建一个脚本。(注意:发射器的Rotation要和子弹的保持一致)
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class GunShoot : MonoBehaviour
- {
-
- public GameObject bulletPrefab; //子弹预制体
-
- void Update()
- {
-
- Shoot();
- }
-
- void Shoot()
- {
- if (Input.GetKeyDown(KeyCode.Space)) //如果按下空格键,生成预制体
- {
- Instantiate(bulletPrefab, transform.position, transform.rotation); //生成预制体
- }
- }
-
- }
-
写好后不要忘记将子弹的预制体拖到脚本里。现在,我们已经可以通过按下空格键,来生成一枚子弹啦,只是还不能将其发射出去
第五、我们给子弹再新建一个脚本,让其具有移动功能。
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class Bullet : MonoBehaviour {
- public float speed = 8f; //子弹速度
-
- void Start () {
- Destroy(gameObject, 7f); //7s后销毁自身
- }
-
- void Update () {
- transform.Translate(0, Time.deltaTime * speed, 0); //子弹位移
- }
-
- }
下边进行蜘蛛动画的添加
把蜘蛛动画拖动进去
添加Trigger
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。