unity蜘蛛小游戏(有一些残缺)

一、实现人物的移动

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

控制角色移动
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

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值