Singularity/Library/PackageCache/com.unity.2d.tilemap.extras.../Runtime/Tiles/RuleOverrideTile/AdvancedRuleOverrideTile.cs
2024-05-06 11:45:45 -07:00

142 lines
5.3 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine.Scripting.APIUpdating;
namespace UnityEngine.Tilemaps
{
/// <summary>
/// Rule Override Tiles are Tiles which can override a subset of Rules for a given Rule Tile to provide specialised behaviour while keeping most of the Rules originally set in the Rule Tile.
/// </summary>
[MovedFrom(true, "UnityEngine")]
[Serializable]
[HelpURL("https://docs.unity3d.com/Packages/com.unity.2d.tilemap.extras@latest/index.html?subfolder=/manual/RuleOverrideTile.html")]
public class AdvancedRuleOverrideTile : RuleOverrideTile
{
/// <summary>
/// Gets the overriding TilingRuleOutput of a given TilingRule.
/// </summary>
/// <param name="originalRule">The original TilingRule that is overridden</param>
public RuleTile.TilingRuleOutput this[RuleTile.TilingRule originalRule]
{
get
{
foreach (var overrideRule in m_OverrideTilingRules)
if (overrideRule.m_Id == originalRule.m_Id)
return overrideRule;
return null;
}
set
{
for (int i = m_OverrideTilingRules.Count - 1; i >= 0; i--)
{
if (m_OverrideTilingRules[i].m_Id == originalRule.m_Id)
{
m_OverrideTilingRules.RemoveAt(i);
break;
}
}
if (value != null)
{
var json = JsonUtility.ToJson(value);
var overrideRule = JsonUtility.FromJson<RuleTile.TilingRuleOutput>(json);
m_OverrideTilingRules.Add(overrideRule);
}
}
}
/// <summary>
/// The Default Sprite set when creating a new Rule override.
/// </summary>
public Sprite m_DefaultSprite;
/// <summary>
/// The Default GameObject set when creating a new Rule override.
/// </summary>
public GameObject m_DefaultGameObject;
/// <summary>
/// The Default Collider Type set when creating a new Rule override.
/// </summary>
public Tile.ColliderType m_DefaultColliderType = Tile.ColliderType.Sprite;
/// <summary>
/// A list of TilingRule Overrides
/// </summary>
public List<RuleTile.TilingRuleOutput> m_OverrideTilingRules = new List<RuleTile.TilingRuleOutput>();
/// <summary>
/// Applies overrides to this
/// </summary>
/// <param name="overrides">A list of overrides to apply</param>
/// <exception cref="ArgumentNullException">The input overrides list is not valid</exception>
public void ApplyOverrides(IList<KeyValuePair<RuleTile.TilingRule, RuleTile.TilingRuleOutput>> overrides)
{
if (overrides == null)
throw new System.ArgumentNullException("overrides");
for (int i = 0; i < overrides.Count; i++)
this[overrides[i].Key] = overrides[i].Value;
}
/// <summary>
/// Gets overrides for this
/// </summary>
/// <param name="overrides">A list of overrides to fill</param>
/// <param name="validCount">Returns the number of valid overrides for Rules</param>
/// <exception cref="ArgumentNullException">The input overrides list is not valid</exception>
public void GetOverrides(List<KeyValuePair<RuleTile.TilingRule, RuleTile.TilingRuleOutput>> overrides, ref int validCount)
{
if (overrides == null)
throw new System.ArgumentNullException("overrides");
overrides.Clear();
if (m_Tile)
{
foreach (var originalRule in m_Tile.m_TilingRules)
{
RuleTile.TilingRuleOutput overrideRule = this[originalRule];
overrides.Add(new KeyValuePair<RuleTile.TilingRule, RuleTile.TilingRuleOutput>(originalRule, overrideRule));
}
}
validCount = overrides.Count;
foreach (var overrideRule in m_OverrideTilingRules)
{
if (!overrides.Exists(o => o.Key.m_Id == overrideRule.m_Id))
{
var originalRule = new RuleTile.TilingRule() { m_Id = overrideRule.m_Id };
overrides.Add(new KeyValuePair<RuleTile.TilingRule, RuleTile.TilingRuleOutput>(originalRule, overrideRule));
}
}
}
/// <summary>
/// Updates the Rules with the Overrides set for this AdvancedRuleOverrideTile
/// </summary>
public override void Override()
{
if (!m_Tile || !m_InstanceTile)
return;
PrepareOverride();
var tile = m_InstanceTile;
tile.m_DefaultSprite = m_DefaultSprite;
tile.m_DefaultGameObject = m_DefaultGameObject;
tile.m_DefaultColliderType = m_DefaultColliderType;
foreach (var rule in tile.m_TilingRules)
{
var overrideRule = this[rule];
if (overrideRule != null)
{
JsonUtility.FromJsonOverwrite(JsonUtility.ToJson(overrideRule), rule);
}
}
}
}
}