123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- 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);
- }
- }
- }
- }
- }
|