前言
上一次我们设计了第四个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而言