Unity day5 添加物品,武器
试玩了一下eve frontier啊,这波是强迫所有玩家玩制造和工业,喜欢刷怪打架的小伙伴们有福了
Unity day5 添加物品,武器
昨天设计好了武器的结构,现在先把物品的结构和底子写好。
物品结构
思考物品的组成部分:
id,物品名,物品描述,堆叠数量,物品价值
由于作品玩法是横板过关,所以不需要其他更详细的设定了。所有敌人掉落的物品可能会直接转换成资金一类的东西。
创建物品基类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemBase
{
public string id;
public string name;
public string description;
public float value;
public int rare;
public ItemBase(string id, string name, float value)
{
this.id = id;
this.name = name;
this.value = value;
}
public ItemBase(string id,string name,string des, float value,int rare) : this(id, name, value)
{
this.description = des;
this.rare = rare;
}
}
接下来编写物品实例和物品管理器:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemManager
{
public static Dictionary<string, ItemBase> ItemBaseMap = new Dictionary<string, ItemBase>();
public static Logger logger = new Logger(new MyLogHandler());
static bool inited = false;
public static void RegisterItem(ItemBase item)
{
if (ItemBaseMap.ContainsKey(item.id))
{
Log(item.id + " 已存在");
return;
}
ItemBaseMap[item.id] = item;
}
public static ItemBase getItemBase(string id)
{
return ItemBaseMap[id];
}
public static void init()
{
if (inited) return;
inited = true;
}
public static void Log(string s)
{
logger.Log("[ItemManager]" + s);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemInstance : MonoBehaviour
{
public ItemBase Base;
public ItemInstance(string id)
{
this.Base = ItemManager.getItemBase(id);
}
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
比较类似的一个注册机形式。
接下来根据物品基类完成规划好的武器基类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WeaponBase : ItemBase
{
public WeaponBase(string id, string name, string des, float value, int rare) : base(id, name, des, value, rare)
{
}
}
这里就开始涉及到大量的设定数据了,因此从这里开始完善配置文件读取。
依然和以前一样采用json进行读入,不过不知道有没有类似于gson那样方便读入的库了。总之先编辑好几个测试用的json:
{
"id":"misc_scarp",
"name":"金属废料",
"description":"达到使用寿命的金属零件和设备,可以直接丢进回收站了。",
"value": 2000,
"rare": 0
}
{
"id":"civil_minigun",
"name":"民用小型加特林磁轨炮",
"description":"将尘埃聚合并加速发射出去的磁轨炮,无需也无法装填普通弹药",
"value":0,
"rare":0,
"damage": 5,
"rpm": 180,
"mode": ["full"],
"speedModifier": 1.0,
"canSprintShoot": true,
"walkSpreadModifier": 2,
"shootSpread": 5,
"shootOffset": 1,
"shootNum": 1,
"droppingCast": false,
"render":{
}
}
rrender部分先空着,目前不需要。
据此完善WeaponBase类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WeaponBase : ItemBase
{
public float damage=0;
public float rpm=60;
public List<int> modes=new List<int>();
public float speedModifier = 1.0f;
public bool canSprintShoot = false;
public float walkSpreadModifier = 2.0f;
public float shootSpread = 0;
public float shootOffset = 0;
public int shootNum = 1;
public bool droppingCast = false;
public WeaponBase(string id, string name, string des, float value, int rare) : base(id, name, des, value, rare)
{
}
public static WeaponBase fromJson(string json)
{
WeaponBase weapon = JsonUtility.FromJson<WeaponBase>(json);
return weapon;
}
}
接下来完成Manager中的初始化部分:
public static void init()
{
if (inited) return;
inited = true;
string jsonContent = "";
string path = "data/items";
path = Path.Combine(Application.streamingAssetsPath, path);
{
string miscPath = Path.Combine(path, "misc");
foreach(var i in FileHelper.ListAllFile(miscPath))
{
if (i.Name.Contains(".meta"))continue;
RegisterItem(ItemBase.fromJson(i.ToString()));
}
}
{
string weaponPath = Path.Combine(path, "weapon");
foreach (var i in FileHelper.ListAllFile(weaponPath))
{
if (i.Name.Contains(".meta"))continue;
RegisterItem(WeaponBase.fromJson(i.ToString()));
}
}
}
运行游戏,无报错。接下来根据weaponBase完成武器实例,用来记录弹药等信息,并完善装备系统。装备系统要求玩家和敌方同一个基类,方便后续处理攻击过程
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WeaponInstance : MonoBehaviour
{
public WeaponBase Base;
public long lastShoot = 0;
public int ammoLeft = 0;
public EntityBase owner;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}

浙公网安备 33010602011771号