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()
    {
        
    }
}
posted @ 2025-09-07 11:38  国土战略局特工  阅读(10)  评论(0)    收藏  举报