170 lines
4.5 KiB
C#
170 lines
4.5 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
[System.Serializable]
|
|
public struct RemainsMode
|
|
{
|
|
public string Rename;
|
|
public RemainsItem remains;
|
|
public int Count;
|
|
}
|
|
[CreateAssetMenu(fileName = "背包", menuName = "仪式/背包")]
|
|
public class RemainsBag : ScriptableObject
|
|
{
|
|
public List<RemainsMode> Items;
|
|
[Header("太阳神之眼")]
|
|
public GameObject SunRemains;
|
|
[Header("其他遗物")]
|
|
public GameObject OtherRemains;
|
|
public void AddItems(RemainsItem remainsItem, int count = 1)
|
|
{
|
|
for (int i = 0; i < Items.Count; i++)
|
|
{
|
|
if (remainsItem == Items[i].remains)
|
|
{
|
|
RemainsMode remainsMode = Items[i];
|
|
remainsMode.Count += count;
|
|
Items[i] = remainsMode;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
public void AddItems(string Itemname, int count = 1)
|
|
{
|
|
for (int i = 0; i < Items.Count; i++)
|
|
{
|
|
if (Itemname == Items[i].Rename)
|
|
{
|
|
RemainsMode remainsMode = Items[i];
|
|
remainsMode.Count += count;
|
|
Items[i] = remainsMode;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
public void CutItems(RemainsItem remainsItem, int count = 1)
|
|
{
|
|
for (int i = 0; i < Items.Count; i++)
|
|
{
|
|
if (remainsItem == Items[i].remains)
|
|
{
|
|
RemainsMode remainsMode = Items[i];
|
|
remainsMode.Count -= count;
|
|
|
|
if (remainsMode.Count <= 0)
|
|
{
|
|
Items.RemoveAt(i);
|
|
}
|
|
else
|
|
{
|
|
Items[i] = remainsMode;
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
public void CutItems(string Itemname, int count = 1)
|
|
{
|
|
for (int i = 0; i < Items.Count; i++)
|
|
{
|
|
if (Itemname == Items[i].Rename)
|
|
{
|
|
RemainsMode remainsMode = Items[i];
|
|
remainsMode.Count -= count;
|
|
|
|
if (remainsMode.Count <= 0)
|
|
{
|
|
Items.RemoveAt(i);
|
|
}
|
|
else
|
|
{
|
|
Items[i] = remainsMode;
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
public RemainsMode GetRemainsMode(string Itemname)
|
|
{
|
|
RemainsMode remainsMode = new RemainsMode();
|
|
for (int i = 0; i < Items.Count; i++)
|
|
{
|
|
if (Itemname == Items[i].Rename)
|
|
{
|
|
remainsMode = Items[i];
|
|
return remainsMode;
|
|
}
|
|
}
|
|
return remainsMode;
|
|
}
|
|
|
|
public RemainsItem GetRemainsItem(string Itemname)
|
|
{
|
|
RemainsMode remainsMode = new RemainsMode();
|
|
for (int i = 0; i < Items.Count; i++)
|
|
{
|
|
if (Itemname == Items[i].Rename)
|
|
{
|
|
remainsMode = Items[i];
|
|
return remainsMode.remains;
|
|
}
|
|
}
|
|
return remainsMode.remains;
|
|
}
|
|
public Sprite GetSprite(string Itemname)
|
|
{
|
|
RemainsMode remainsMode = GetRemainsMode(Itemname);
|
|
|
|
return remainsMode.remains.remainssprite;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 得到遗物奖励
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public RemainsItem GetRemainsReward()
|
|
{
|
|
// 创建一个可用的奖励列表,过滤掉权重为 0 的项
|
|
List<RemainsItem> availableItems = new List<RemainsItem>();
|
|
foreach (var item in Items)
|
|
{
|
|
if (item.remains.WightNum > 0) // 过滤掉权重为0的项
|
|
{
|
|
availableItems.Add(item.remains);
|
|
}
|
|
}
|
|
|
|
// 计算所有权重的总和
|
|
int totalWeight = 0;
|
|
foreach (var item in availableItems)
|
|
{
|
|
totalWeight += item.WightNum;
|
|
}
|
|
|
|
// 如果没有有效的项,返回 null
|
|
if (totalWeight == 0)
|
|
{
|
|
Debug.LogWarning("没有可用的遗物项,所有项的权重都为 0");
|
|
return null;
|
|
}
|
|
|
|
// 在 0 到 totalWeight 之间生成一个随机数
|
|
int randomWeight = Random.Range(0, totalWeight);
|
|
|
|
// 遍历可用的项,根据权重找到对应的项
|
|
int cumulativeWeight = 0;
|
|
foreach (var item in availableItems)
|
|
{
|
|
cumulativeWeight += item.WightNum;
|
|
if (randomWeight < cumulativeWeight)
|
|
{
|
|
return item; // 找到符合的项,返回
|
|
}
|
|
}
|
|
return availableItems[0];
|
|
}
|
|
}
|