基于unity3d的google小恐龙游戏实现6-----武器系统

本文介绍了作者在Unity中为小恐龙游戏添加武器系统的过程,包括设计武器切换的物品栏,使用Rigidbody处理武器动画和物理效果,以及创建不同类型的武器,如射击、近战和追踪。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

上一次我们设计了第四个boss,不过感觉对象类的东西还是设计的差不多了,所以这次搞点其他系统。可以看到,我这个游戏练习里面小恐龙的核心就是躲避障碍物,躲避弹幕以及敌人,就是一个很简单的2d游戏。感觉可以再小恐龙身上动手。小恐龙好像很弱呢,只可以跳和冲刺。所以我决定,给小恐龙添加一个武器系统,武器由boss掉落,根据之前写的四个boss分别设计四种不一样机制的武器。用一个中心脚本控制切换等等,那就开始今天的练习吧。

设计本体

武器框

很多游戏都有一个物品栏的设计,在界面下方或者上方,我也可以设计一个物品栏一样的东西。同时把一个控制武器切换的脚本放在里面。那样就可以实现一个物品栏切换的功能。同时储存武器的对象在一个GameObject的数组里面,再根据一个按键切换武器。不过由于武器对象和武器的贴图不能放在一起,所以物品栏上显示的是一个与手中的武器一摸一样的对象(无脚本)。

对于这个一个物品栏,上面就是设计思路了,比较简单。但是关于击败boss掉落这一个,只需要再enemysummon里面修改一个最大值,表示武器解锁的进度就可以了。并没有太大难度。

话不多说,以下是武器物品栏的代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WeaponCude : MonoBehaviour
{
    [Header("对于武器框架的定义")]
    public Vector3 CudePos;
    public int weaponNum;//总数
    public int weaponLimitNow;//表示现在解锁的
    public int nowChoose;//表示现在选择的
    public GameObject []weaponPre;//武器的对象
    public bool isDisplay;
    public GameObject []weaponSprite;
    public GameObject dino;//恐龙对象
    public Vector3 DinoPos;//对象坐标
    public float TimeNow;
    public float TimePast;
    public GameObject wc;//目前操作对象
    public Vector3 lastStand;//不知为何会抖动,所以加一个记录地点的
    // Start is called before the first frame update
    void Start()
    {
        weaponNum = 3;
        weaponLimitNow = 3;
        nowChoose = -1;
        CudePos = new Vector3(19.8f, 8.2f, 0);
        dino = GameObject.Find("dino");//找到恐龙对象
        DinoPos = dino.transform.position;
        lastStand = dino.transform.position;
        TimeNow = Time.time;
        TimePast = 0.2f;
        wc = null;
    }

    // Update is called once per frame
    void Update()
    {
        if (Time.time - TimeNow >= TimePast)
        {
            if (Input.GetKey(KeyCode.Q))//获取q是否被按下
            {
                WeaponChoosePlus();//增加计数,轮到下一个武器
                GameObject[] weaponNow = GameObject.FindGameObjectsWithTag("Weapon");
                foreach (GameObject wt in weaponNow)
                {
                    Destroy(wt);
                }//消灭现在的武器以及显示栏上的武器
                GameObject wp = Instantiate(weaponSprite[nowChoose]);//实例化对象
                wc = Instantiate(weaponPre[nowChoose]);//角色手中的武器
                wp.transform.position = CudePos;
                TimeNow = Time.time;
            }
        }
    }

    void WeaponChoosePlus()//按键转换
    {
        if (nowChoose + 1 > weaponLimitNow)
        {
            nowChoose = 0;
        }
        else
        {
            nowChoose++;
        }
    }
}
 

而且我这个物品栏是绑定玩家手中的武器的,当物品栏切换时,玩家手中的武器也会同步切换。

 至于为什么不在这个脚本里面就直接把武器的坐标放在玩家手上,这个有一定原因,一会再说。

以下是使用的物品栏贴图,随便在作图那里画的。

为什么不在这里直接把武器坐标放在玩家手上

这个是因为来源于一个bug,在我想把武器放在玩家手上时用的时常规方法,也就是获取玩家坐标,然后直接把武器对象的坐标修改在玩家处。这个很正常的操作却出现了问题,当玩家停止移动时,手中的武器会发生抽搐,抖动,观察transform就是y轴会瞬间突变,然后在回到原位,非常奇怪,而且我并没有给这个对象添加刚体以及碰撞,所以物理检测的问题应该不是,所以我尝试把这一段代码直接放在武器的脚本里面(上述问题原因)

!发现还是解决不了,依然抽动,最后通过一段时间查找,发现,其实是因为我的方法问题,直接改变position这一个代码逻辑上固然没错,但是,对于unity而言࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值