最近在做塔防游戏项目的时候遇到一个问题,就是JSON文件的信息解析过来后发现只要炮塔对敌怪攻击其减血作会作用在所有的敌怪上,这样逻辑就不对了;
找了许多方法,最后做一下总结:
1. 引入ICloneable接口,将所有的敌怪的所属信息复制克隆
2. 不实用类的方法实现,替换成结构体(因为结构体是值类型存储的)
using UnityEngine;
using System.Collections.Generic;//引入泛型命名空间
using System.Collections;
using System;
/// <summary>
/// 定义解析JSON文件的脚本
/// </summary>
public static class DataPath{
//将JSON文件的路径定义成string类型
public static string TOWER_PATH = "DataTables/towerjson";//json文件的路径
public static string ENEMY_PATH = "DataTables/enemyjson";
}
/// <summary>
/// 所有炮塔的数据
/// </summary>
[Serializable]//序列化用于将脚本内容序列化显示出来
/// <summary>
/// 声明TowerDataAble类用于存储炮塔的数据表类
/// </summary>
public class TwerDataTable{
//用集合表示可以通过索引访问的对象的列表,可提供对列表进行 索引修改的权限
//将Tower类做为List集合的泛型类型传入进来,用来索引json文件的中的数据
public List<TowerData> allTowers;
}
/// <summary>
/// 炮塔的数据
/// </summary>
[Serializable]
/// <summary>
/// 声明类,用来表示字段和json中的信息对应关系
/// </summary>
public class TowerData{
public int id;//编号
public string name;//炮塔名称
public string prefabName;//预制体的名称
public float price;//价格
public float damage;//攻击力
public string fxPrefab;//
}
[Serializable]
/// <summary>
/// 因为敌怪的血量是单个独立的,但此处所用来存储信息的是Class类,类是属于引用类型,
/// 所以要引入Icloneable接口,用以实现将信息克隆的效果
/// </summary>
public class EnemyDataTable: ICloneable{
public List<EnemyData> allEnemys;
public object Clone(){
return MemberwiseClone ();
}
}
[Serializable]
public class EnemyData: ICloneable{
public int id;//编号
public float hp;//当前血量
public float maxHp;//最大血量
public float moveSpeed;//
public float money;//死亡掉落的金钱
public object Clone(){
return this.MemberwiseClone ();
}
}