рдпреВрдирд┐рдЯреА 3 рдбреА рдореЗрдВ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдФрд░ рдмрд╛рд╣рд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдкрд░рд┐рдЪрдп


рдирдорд╕реНрдХрд╛рд░ рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ, рдЖрдЬ рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдпреВрдирд┐рдЯреА 3 рдбреА рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдЧреЗрдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдкрд░рдВрдкрд░рд╛ рд╕реЗ, рдореИрдВ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ред рдЧреЗрдорд┐рдВрдЧ рдЙрджреНрдпреЛрдЧ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╡рд┐рдХрд╕рд┐рдд рдХреАрдВ рдФрд░ рдЦреЗрд▓ рдбрд┐рдЬрд╛рдЗрди рд╢рд┐рд╡рд┐рд░ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╢рд┐рд╡рд┐рд░ (рдЬрд╣рд╛рдВ рдореИрдВ рдЖрдЬ рддрдХ рд╣реВрдВ) рджреЛрдиреЛрдВ рдХрд╛ рджреМрд░рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбреЗрдЯрд╛ рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХреНрд▓рд╛рд╕рд┐рдХ, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдпреВрдирд┐рдЯреА 3 рдбреА рдлреЙрд░реНрдо рдореЗрдВ, рдРрд╕реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдирд┐рд░реАрдХреНрд╖рдХ рдХреЗ рджреГрд╢реНрдп рднрд╛рдЧ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХреБрдЫ рд╕рдВрдЦреНрдпрд╛рдПрдБ рджрд░реНрдЬ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдЖрджрд┐ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рднрд▓реЗ рд╣реА рдЗрд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реЛ, рдпрд╣ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рд╕рдордп, рдореЛрдиреЛрдПрд╡рд╣реЛрд░ рд╡рд░реНрдЧ рд╕реНрдерд┐рдд рджреГрд╢реНрдп рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реБрджреНрдз рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрддреАрдд рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рдкреНрд░рднрд╛рд╡реА рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ рдФрд░ рдРрд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рдХрд░ рджреЗрдЧрд╛, рдЬрд┐рд╕реЗ рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдиреЛрдЯ : рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХреЛрдб рдХреЗ рд╕рднреА рдПрдХрддрд╛ рд╕рдВрд╕реНрдХрд░рдг 2018.3+ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд░реЛрд╕рд▓рд┐рди рд╕рдВрдХрд▓рдХ (C # 7+ рд╕рдВрд╕реНрдХрд░рдг) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЖрдВрддрд░рд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рд░рд╛рдВрдХ, рд▓рд┐рдВрдХ, рдмрд╛рд╣рд░реА рдПрд╕рдбреАрдХреЗ рдХреА рдкрд╣рдЪрд╛рди, рдЪрд╛рдмрд┐рдпрд╛рдБ, рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╡реИрд╢реНрд╡рд┐рдХ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдЧреЗрдордкреНрд▓реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рд╣рд┐рдд рдЪреАрдЬреЗрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдРрд╕реЗ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдЪрд╛рд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  • рддрд╛рд░
  • рдЗрдВрдЯ
  • рдлреНрд▓реЛрдЯ
  • рдмреВрд▓

рдЕрдиреНрдп рд╕рднреА рдбреЗрдЯрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЖрдк JSON рдХреНрд░рдорд╛рдВрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рднреА рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо ScriptableObject рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬреИрд╕реЗ рдХреЛрдИ рдирд╣реАрдВред

public class Setting : ScriptableObject { public enum ParameterTypeEnum { Float, Int, String, Bool } [Serializable] public class ParameterData { public string Name => _name; public ParameterTypeEnum ParameterType => _parameterType; public string DefaultValue => _defaultValue; [SerializeField] private string _name; [SerializeField] private ParameterTypeEnum _parameterType; [SerializeField] private string _defaultValue; } [SerializeField] protected ParameterData[] Parameters; } 

рдЗрд╕рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реИ:

  • рд╡реНрдпрд╛рд╕ рдирд╛рдо
  • рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░
  • рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ

рдиреЛрдЯ : рд▓рд╛рдЗрдиреЗрдВ рдХреНрдпреЛрдВ? рдпрд╣ рдореБрдЭреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ 4 рдЪрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧрд╛ред

рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд╣рд╛рдпрдХ рддрд░реАрдХреЗ рдФрд░ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХ рдмреЙрдХреНрд╕рд┐рдВрдЧ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛ред
 protected readonly IDictionary<string, object> settingParameters = new Dictionary<string, object>(); [NonSerialized] protected bool initialized; private void OnEnable() { #if UNITY_EDITOR if (EditorApplication.isPlayingOrWillChangePlaymode) { Initialization(); } #else Initialization(); #endif } public virtual T GetParameterValue<T>(string name) { if (settingParameters.ContainsKey(name)) { var parameterValue = (T)settingParameters[name]; return parameterValue; } else { Debug.Log("[Setting]: name not found [{0}]".Fmt(name)); } return default; } protected virtual void Initialization() { if (initialized || Parameters == null) return; for (var i = 0; i < Parameters.Length; i++) { var parameter = Parameters[i]; object parameterValue = null; switch (parameter.ParameterType) { case ParameterTypeEnum.Float: { if (!float.TryParse(parameter.DefaultValue, out float value)) { value = default; } parameterValue = GetValue(parameter.Name, value); } break; case ParameterTypeEnum.Int: { if (!int.TryParse(parameter.DefaultValue, out int value)) { value = default; } parameterValue = GetValue(parameter.Name, value); } break; case ParameterTypeEnum.String: { parameterValue = GetValue(parameter.Name, parameter.DefaultValue); } break; case ParameterTypeEnum.Bool: { if (!bool.TryParse(parameter.DefaultValue, out bool value)) { value = default; } parameterValue = GetValue(parameter.Name, value); } break; } settingParameters.Add(parameter.Name, parameterValue); } initialized = true; } protected virtual object GetValue<T>(string paramName, T defaultValue) { return defaultValue; } 


рд╢реБрд░реБрдЖрдд OnEnable рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ ред рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЬрд╛рдЧрддреЗ ? рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕реЗ CreateInstance рдХреЗ рд╕рдордп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдЬрдм рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ ScriptableObject рдХреЛ рдкрд╣рд▓реЗ, рдСрдирдбрд┐рд╕реЗрдмрд▓ (рдХреЗрд╡рд▓ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдСрдирдПрдиреЗрдмрд▓ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рджреМрд░рд╛рди рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдЦреБрд▓рдиреЗ рд╕реЗ рдХрд╛рдо рди рдЪрд▓реЗ, рддреЛ рдЖрдкрдХреЛ рдкреВрд░реНрд╡-рдирд┐рд░реНрджреЗрд╢ рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 #if UNITY_EDITOR using UnityEditor; #endif 

рд╣рдореЗрдВ рдЖрдЧреЗ GetValue рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдЖрдВрддрд░рд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдорд╛рдкрджрдВрдбреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП GetParameterValue рд╡рд┐рдзрд┐ рд╣рдорд╛рд░реА рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрдирдмреЙрдХреНрд╕рд┐рдВрдЧ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд┐рд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рджреГрд╢реНрдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рд▓рд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдкрдбреЗрдЯ рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рди рдХрд░реЗрдВред

рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

 public class MyLogic : MonoBehaviour { [SerializeField] private Setting _localSetting; private string _localStrValue; private int _localIntValue; private float _localFloatValue; private bool _localBoolValue; private void Start() { _localStrValue = _localSetting.GetParameterValue<string>("MyStr"); _localIntValue = _localSetting.GetParameterValue<int>("MyInt"); _localFloatValue = _localSetting.GetParameterValue<float>("MyFloat"); _localBoolValue = _localSetting.GetParameterValue<bool>("MyBool"); } } 

рд╣рдордиреЗ рдиреАрдВрд╡ рд▓рд┐рдЦреА рдФрд░ рдЕрдм рд╣рдореЗрдВ рдПрдХ рд╕рдВрдкрд╛рджрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рд╕рд┐рд░реНрдл рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛ рдерд╛ рдЬреЛ рдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЗрдиреВ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 CreateAssetMenu(fileName = "New Setting", menuName = "Setting") 

рдЕрдм рд╣рдо рдПрдХ рдХрд╕реНрдЯрдо рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЖрдкрдХреЛ рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдФрд░ рдПрдХ рдмрд╛рд╣рд░реА рд╕рдВрдкрд╛рджрдХ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
 [CustomEditor(typeof(Setting), true)] public class SettingCustomInspector : Editor { private GUIStyle _paramsStyle; private GUIStyle _paramInfoStyle; private const string _parameterInfo = "<color=white>Name</color><color=grey> = </color><color=yellow>{0}</color> <color=white>Type</color><color=grey> = </color><color=yellow>{1}</color> <color=white>Defualt Value</color><color=grey> = </color><color=yellow>{2}</color>"; public override void OnInspectorGUI() { if (GUILayout.Button("Edit Setting")) { SettingEditorWindow.Show(serializedObject.targetObject as Setting); } EditorGUILayout.LabelField("Parameters:", _parametersStyle, GUILayout.ExpandWidth(true)); var paramsProp = serializedObject.FindProperty("Parameters"); for (var i = 0; i < paramsProp.arraySize; i++) { var paramProp = paramsProp.GetArrayElementAtIndex(i); var paramNameProp = paramProp.FindPropertyRelative("_name"); var paramTypeProp = paramProp.FindPropertyRelative("_parameterType"); var paramDefaultValueProp = paramProp.FindPropertyRelative("_defaultValue"); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField(_paramInfo.Fmt( paramNameProp.stringValue, paramTypeProp.enumDisplayNames[paramTypeProp.enumValueIndex], paramDefaultValueProp.stringValue), _paramInfoStyle); EditorGUILayout.EndHorizontal(); } } private void PrepareGUIStyle() { if (_parametersStyle == null) { _paramsStyle = new GUIStyle(GUI.skin.label); _paramsStyle.fontStyle = FontStyle.Bold; _paramsStyle.fontSize = 12; _paramsStyle.normal.textColor = Color.green; _paramInfoStyle = new GUIStyle(GUI.skin.label); _paramInfoStyle.richText = true; } } } 


рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

рдЫрд╡рд┐

рдЕрдм рд╣рдореЗрдВ рд╕реНрд╡рдпрдВ рдФрд░ рдЙрдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рдВрдкрд╛рджрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдХрд╕реНрдЯрдо рд╡рд┐рдВрдбреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
 public class SettingEditorWindow : EditorWindow { public Setting SelectedAsset; private int _currentSelectedAsset = -1; private readonly List<string> _assetNames = new List<string>(); private readonly IList<SerializedObject> _settingSerializationObjects = new List<SerializedObject>(); private readonly IList<T> _assets = new List<T>(); private readonly IList<int> _editedNames = new List<int>();; private GUIContent _editNameIconContent; private GUIStyle _headerStyle; private GUIStyle _parametersStyle; private GUIStyle _parameterHeaderStyle; private GUIStyle _nameStyle; private Vector2 _scrollInspectorPosition = Vector2.zero; private Vector2 _scrollAssetsPosition = Vector2.zero; private const string _SELECTED_ASSET_STR = "SettingSelected"; public static void Show(Setting asset) { var instance = GetWindow<Setting>(true); instance.title = new GUIContent("Settings Editor", string.Empty); instance.SelectedAsset = asset; } private void OnEnable() { var assetGuids = AssetDatabase.FindAssets("t:{0}".Fmt(typeof(Setting).Name)); foreach (var guid in assetGuids) { var path = AssetDatabase.GUIDToAssetPath(guid); var asset = AssetDatabase.LoadAssetAtPath<T>(path); _assetNames.Add(path.Replace("Assets/", "").Replace(".asset", "")); _assets.Add(asset); _settingSerializationObjects.Add(new SerializedObject(asset)); } _currentSelectedAsset = PlayerPrefs.GetInt(_SELECTED_ASSET_STR, -1); _editNameIconContent = new GUIContent(EditorGUIUtility.IconContent("editicon.sml")); } private void OnDisable() { PlayerPrefs.SetInt(_SELECTED_ASSET_STR, _currentSelectedAsset); } private void PrepareGUIStyle() { if (_headerStyle == null) { _headerStyle = new GUIStyle(GUI.skin.box); _headerStyle.fontStyle = FontStyle.Bold; _headerStyle.fontSize = 14; _headerStyle.normal.textColor = Color.white; _headerStyle.alignment = TextAnchor.MiddleCenter; _parametersStyle = new GUIStyle(GUI.skin.label); _parametersStyle.fontStyle = FontStyle.Bold; _parametersStyle.fontSize = 12; _parametersStyle.normal.textColor = Color.green; } } private void OnGUI() { PrepareGUIStyle(); if (SelectedAsset != null) { _currentSelectedAsset = _assets.IndexOf(SelectedAsset); SelectedAsset = null; } EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginVertical(GUI.skin.box, GUILayout.MinWidth(350f), GUILayout.ExpandHeight(true)); _scrollAssetsPosition = EditorGUILayout.BeginScrollView(_scrollAssetsPosition, GUIStyle.none, GUI.skin.verticalScrollbar); _currentSelectedAsset = GUILayout.SelectionGrid(_currentSelectedAsset, _assetNames.ToArray(), 1); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(GUILayout.ExpandWidth(true)); var assetSerializedObject = (_currentSelectedAsset >= 0) ? _settingSerializationObjects[_currentSelectedAsset] : null; EditorGUILayout.Space(); EditorGUILayout.LabelField((_currentSelectedAsset >= 0) ? _assetNames[_currentSelectedAsset] : "Select Asset...", _headerStyle, GUILayout.ExpandWidth(true)); EditorGUILayout.Space(); _scrollInspectorPosition = EditorGUILayout.BeginScrollView(_scrollInspectorPosition, GUIStyle.none, GUI.skin.verticalScrollbar); Draw(assetSerializedObject); EditorGUILayout.EndScrollView(); EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); assetSerializedObject?.ApplyModifiedProperties(); } private void Draw(SerializedObject assetSerializationObject) { if (assetSerializationObject == null) return; EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Parameters:", _parametersStyle, GUILayout.Width(20f), GUILayout.ExpandWidth(true)); var parametersProperty = assetSerializationObject.FindProperty("Parameters"); if (GUILayout.Button("Add", GUILayout.MaxWidth(40f))) { if (parametersProperty != null) { parametersProperty.InsertArrayElementAtIndex(parametersProperty.arraySize); } } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); if (parametersProperty != null) { for (var i = 0; i < parametersProperty.arraySize; i++) { var parameterProperty = parametersProperty.GetArrayElementAtIndex(i); var parameterNameProperty = parameterProperty.FindPropertyRelative("_name"); var parameterTypeProperty = parameterProperty.FindPropertyRelative("_parameterType"); var parameterDefaultValueProperty = parameterProperty.FindPropertyRelative("_defaultValue"); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button(_editNameIconContent, GUILayout.MaxWidth(25f), GUILayout.MaxHeight(18f))) { if (_editedNames.Contains(i)) { _editedNames.Remove(i); } else { _editedNames.Add(i); } } EditorGUILayout.LabelField("Name", _parameterHeaderStyle, GUILayout.MaxWidth(40f)); if (_editedNames.Contains(i)) { parameterNameProperty.stringValue = EditorGUILayout.TextField(parameterNameProperty.stringValue, GUILayout.Width(175f)); var ev = Event.current; if (ev.type == EventType.MouseDown || ev.type == EventType.Ignore || (ev.type == EventType.KeyDown && ev.keyCode == KeyCode.Return)) { _editedNames.Remove(i); } } else { EditorGUILayout.LabelField(parameterNameProperty.stringValue, _nameStyle, GUILayout.Width(175f)); } EditorGUILayout.LabelField("Type", _parameterHeaderStyle, GUILayout.MaxWidth(40f)); parameterTypeProperty.enumValueIndex = EditorGUILayout.Popup(parameterTypeProperty.enumValueIndex, parameterTypeProperty.enumDisplayNames, GUILayout.Width(75f)); GUILayout.Space(20f); EditorGUILayout.LabelField("DefaultValue", _parameterHeaderStyle, GUILayout.Width(85f)); switch (parameterTypeProperty.enumValueIndex) { case 0: { if (!float.TryParse(parameterDefaultValueProperty.stringValue, out float value)) { value = default; } value = EditorGUILayout.FloatField(value, GUILayout.ExpandWidth(true)); parameterDefaultValueProperty.stringValue = value.ToString(); } break; case 1: { if (!int.TryParse(parameterDefaultValueProperty.stringValue, out int value)) { value = default; } value = EditorGUILayout.IntField(value, GUILayout.ExpandWidth(true)); parameterDefaultValueProperty.stringValue = value.ToString(); } break; case 2: parameterDefaultValueProperty.stringValue = EditorGUILayout.TextField(parameterDefaultValueProperty.stringValue, GUILayout.ExpandWidth(true)); break; case 3: { if (!bool.TryParse(parameterDefaultValueProperty.stringValue, out bool value)) { value = default; } value = EditorGUILayout.Toggle(value, GUILayout.ExpandWidth(true)); parameterDefaultValueProperty.stringValue = value.ToString(); } break; } if (GUILayout.Button("-", GUILayout.MaxWidth(25f), GUILayout.MaxHeight(18f))) { if (_editedNames.Contains(i)) { _editedNames.Remove(i); } parametersProperty.DeleteArrayElementAtIndex(i); } EditorGUILayout.EndHorizontal(); } } } } 


рдореИрдВ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рдирд╣реАрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрдкрд╛рджрдХ рдЖрдкрдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛ рдЦреЛрд▓рддреЗ рд╕рдордп, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ AssetDatabase.FindAssets рд╡рд┐рдзрд┐ ("t: {0}" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдвреВрдВрдврддреЗ рд╣реИрдВред Fmt (рдЯрд╛рдЗрдкреЛрдлрд╝ (рд╕реЗрдЯрд┐рдВрдЧ) .Name)) ред рдФрд░ рдЗрд╕рдХреЗ рдЖрдХрд╕реНрдорд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдо рдХрд╛ рд╕рдВрдкрд╛рджрди рднреА рдмрдЯрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╕рдВрдкрд╛рджрдХ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЫрд╡рд┐

рд╣рдордиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЬрд╛рдВрдЪ рдХреА, рдЕрдм рд╣рдо рдПрдХ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдмрд╛рд╣рд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕


рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реЗ рдЦреЗрд▓ рдореЗрдВ, рдЧреЗрдордкреНрд▓реЗ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдЪрд╛рдирдХ рдХреБрдЫ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЖрджрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдмрд┐рд▓реНрдб рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдЬрдорд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдЯреЛрд░реЛрдВ рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдкреБрд╖реНрдЯрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЖрджрд┐ред рд▓реЗрдХрд┐рди рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдЖрд╡реЗрджрди рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ? рдФрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкрд░рд┐рд╡рд░реНрддрди рддрддреНрдХрд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░рд┐рдореЛрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдРрд╕рд╛ рддрдВрддреНрд░ рд╣реИред рдпрд╣ рдПрдХ рдирдпрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХрдИ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдПрд╕рдбреАрдХреЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - рдпрд╣ рдлрд╛рдпрд░рдмреЗрд╕ рдореЗрдВ , рдЧреЗрдордПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдореЗрдВ , рд╕рд╛рде рд╣реА рдпреВрдирд┐рдЯреА рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдореЗрдВ рднреА рд╣реИ ред рдпрд╣ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдиреЛрдЯ : рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрди рд╕рднреА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ рдФрд░ рд╕рдорд╛рди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХрддрд╛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдореЗрдВ рд░рд┐рдореЛрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреА рд╣реИ, рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред

рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реЗрд╡рд╛ рдЯреИрдм рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЫрд╡рд┐

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдпреВрдирд┐рдЯреА 3 рдбреА рдЦрд╛рддреЗ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╡рд╣рд╛рдВ рдЕрдкрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рд╕реЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рдореЗрдиреВ рдореЗрдВ рдмрд╛рдИрдВ рдУрд░ рд░рд┐рдореЛрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЪреБрдиреЗрдВред

рдЫрд╡рд┐

рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЙрди рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ рдЬреЛ рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЬрд┐рдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рд░реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЫрд╡рд┐

рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреБрдХреНрдд рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдирд╛рдо, рдкреНрд░рдХрд╛рд░ рдФрд░ рдореВрд▓реНрдп рджрд░реНрдЬ рдХрд░реЗрдВред

рдЫрд╡рд┐

рдЬрдм рд╣рдордиреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝ рджрд┐рдП рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдореЗрдВ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдиреЛрдЯ : рд╕рд┐рдВрдХ рдмрдЯрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддреБрд░рдВрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрд╕ рд╕рдордп рдЬрдм рдЖрд╡реЗрджрди рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕реА рддрд░рд╣ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ ред

рджреВрд░рд╕реНрде рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдПрд╕рдбреАрдХреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдЪрд╛рд▓реВ рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рдерд╛ред

рд╣рдо рджреВрд░рд╕реНрде рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред
 public sealed class RemoteSetting : Setting { public IList<string> GetUpdatedParameter() { var updatedParameters = new List<string>(); for (var i = 0; i < Parameters.Length; i++) { var parameter = Parameters[i]; switch (parameter.ParameterType) { case ParameterTypeEnum.Float: { var currentValue = Get<float>(parameter.Name); var newValue = RemoteSettings.GetFloat(parameter.Name, currentValue); if (currentValue != newValue) { settingParameters[parameter.Name] = newValue; updatedParameters.Add(parameter.Name); } } break; case ParameterTypeEnum.Int: { var currentValue = Get<int>(parameter.Name); var newValue = RemoteSettings.GetInt(parameter.Name, currentValue); if (currentValue != newValue) { settingParameters[parameter.Name] = newValue; updatedParameters.Add(parameter.Name); } } break; case ParameterTypeEnum.String: { var currentValue = Get<string>(parameter.Name); var newValue = RemoteSettings.GetString(parameter.Name, currentValue); if (string.Compare(currentValue, newValue, System.StringComparison.Ordinal) != 0) { settingParameters[parameter.Name] = newValue; updatedParameters.Add(parameter.Name); } } break; case ParameterTypeEnum.Bool: { var currentValue = Get<bool>(parameter.Name); var newValue = RemoteSettings.GetBool(parameter.Name, currentValue); if (currentValue != newValue) { settingParameters[parameter.Name] = newValue; updatedParameters.Add(parameter.Name); } } break; } } return updatedParameters; } protected override object GetValue<T>(string paramName, T defaultValue) { switch(defaultValue) { case float f: return RemoteSettings.GetFloat(paramName, f); case int i: return RemoteSettings.GetInt(paramName, i); case string s: return RemoteSettings.GetString(paramName, s); case bool b: return RemoteSettings.GetBool(paramName, b); default: return default; } } } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдЧреЗрдЯрд╡реИрд▓реНрдпреВ рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рдирдпрд╛ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рд╛ рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдКрдкрд░, рд╣рдордиреЗ рдХреЛрдб рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрд╛, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджреВрд░рд╕реНрде рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╣реА рдХреБрдВрдЬреА рдореЗрдВ рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдкреНрд░рдмрдВрдзрдХ рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкреНрд░рдмрдВрдзрдХ рдХреЛрдб
 public class SettingsManager : MonoBehaviourSingleton<SettingsManager> { public Setting this[string index] => GetSetting(index); [SerializeField] private Setting[] _settings; private readonly IDictionary<string, Setting> _settingsByName = new Dictionary<string, Setting>(); public void ForceUpdate() { RemoteSettings.ForceUpdate(); } private void Start() { foreach(var setting in _settings) { _settingsByName.Add(setting.name, setting); } RemoteSettings.BeforeFetchFromServer += OnRemoteSettingBeforeUpdate; RemoteSettings.Updated += OnRemoteSettingsUpdated; RemoteSettings.Completed += OnRemoteSettingCompleted; } private Setting GetSetting(string name) { if(_settingsByName.ContainsKey(name)) { return _settingsByName[name]; }else { Debug.LogWarningFormat("[SettingManager]: setting name [{0}] not found", name); return null; } } private void OnRemoteSettingBeforeUpdate() { RemoteSettingBeforeUpdate.Call(); } private void OnRemoteSettingsUpdated() { foreach (var setting in _settingsByName.Values) { if (setting is RemoteSetting) { var updatedParameter = remoteSetting.GetUpdatedParameter(); foreach (var parameterName in updatedParameter) { RemoteSettingUpdated.Call(parameterName); } } } } private void OnRemoteSettingCompleted(bool wasUpdatedFromServer, bool settingsChanged, int serverResponse) { RemoteSettingsCompleted.Call(wasUpdatedFromServer, settingsChanged, serverResponse); } private void OnDestroy() { RemoteSettings.BeforeFetchFromServer -= OnRemoteSettingBeforeUpdate; RemoteSettings.Updated -= OnRemoteSettingsUpdated; RemoteSettings.Completed -= OnRemoteSettingCompleted; } } 


рдкреНрд░рдмрдВрдзрдХ рдХреЛ рдПрдХ рд╕рд┐рдЧреНрд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рджреГрд╢реНрдп рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред рдпрд╣ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рджреГрд╢реНрдп рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВ) рдХреЛ рдмрд╛рд╣рд░ рдХрд░реЗрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд░рд┐рдореЛрдЯрд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рддреАрди рдШрдЯрдирд╛рдПрдВ рд╣реИрдВ:

  1. рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдЗрд╡реЗрдВрдЯ
  2. рдкреИрд░рд╛рдореАрдЯрд░ рдЕрджреНрдпрддрди рдШрдЯрдирд╛ (рдХреЗрд╡рд▓ рд╕рд┐рдВрдХ рдмрдЯрди рджреНрд╡рд╛рд░рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛), рд╕рд╛рде рд╣реА ForceUpdate рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдордЬрдмреВрд░ рдЕрдкрдбреЗрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВред
  3. рджреВрд░рд╕реНрде рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдШрдЯрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЧрдИред рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рднреА рдпрд╣рд╛рдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдиреЛрдЯ : рдХреЛрдб рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдИрд╡реЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдореЗрд░рд╛ рдПрдХ рдЕрдиреНрдп рд▓реЗрдЦ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдиреЛрдЯ : рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ RemoteSettings рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЕрдЧрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдПрдХреНрд╕реЗрд╕ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдбреЗрдЯрд╛ рдХреИрд╢ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдкрд╡рд╛рдж рд╡рд╣ рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╢реБрд░реВ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ рд╡рд╣реА рд╣реИрдВ рдЬреЛ рд╣рдо рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдм рдХреЛрдб рдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред

 public class MyLogic : MonoBehaviour { private const string INGAME_PARAMETERS = "IngamgeParameters"; private const string REMOTE_RAPAMETERS = "RemoteParamteters"; private string _localStrValue; private int _localIntValue; private float _localFloatValue; private bool _localBoolValue; private string _remoteStrValue; private int _remoteIntValue; private float _remoteFloatValue; private bool _remoteBoolValue; private void Start() { var ingameParametes = SettingsManager.Instance[INGAME_PARAMETERS]; var remoteParametes = SettingsManager.Instance[REMOTE_RAPAMETERS]; _localStrValue = ingameParametes.GetParameterValue<string>("MyStr"); _localIntValue = ingameParametes.GetParameterValue<int>("MyInt"); _localFloatValue = ingameParametes.GetParameterValue<float>("MyFloat"); _localBoolValue = ingameParametes.GetParameterValue<bool>("MyBool"); _remoteStrValue = remoteParametes.GetParameterValue<string>("MyStr"); _remoteIntValue = remoteParametes.GetParameterValue<int>("MyInt"); _remoteFloatValue = remoteParametes.GetParameterValue<float>("MyFloat"); _remoteBoolValue = remoteParametes.GetParameterValue<bool>("MyBool"); } } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб рд╕реЗ, рдЖрдВрддрд░рд┐рдХ рдФрд░ рдмрд╛рд╣рд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдмреАрдЪ рдХрд╛рдо рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░, рдЖрдк рджреВрд░рд╕реНрде рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдмрдВрдзрдХ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

рдиреЛрдЯ : рдпрджрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рджреВрд░рд╕реНрде рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдПрд╕рд┐рдЯрд╕реНрдЯреЛрд░ рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд▓рдЧ-рдЗрди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЖрдВрддрд░рд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рд░рд┐рдореЛрдЯ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреВрдирд┐рдЯреА 3 рдбреА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдЗрд╕рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдЕрдкрдиреА A / B рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рджреВрд░рд╕реНрде рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рднреА рд╕рдлрд▓рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрд╕рдбреАрдХреЗ, рд╕рд░реНрд╡рд░ рдЪреАрдЬреЛрдВ, рд╕рд╛рде рд╣реА рдЧреЗрдордкреНрд▓реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдЖрджрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд┐рд░рд╛рдВрдХ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЧреЗрдо рдбрд┐рдЬрд╛рдЗрдирд░ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд░реНрдгрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ, рдФрд░ рдЬрд╣рд╛рдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╡рд╣ рджреГрд╢реНрдп рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ рдЧреЗрдордкреНрд▓реЗ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╣рдордиреЗ ScriptableObject рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдРрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛, рдЙрдиреНрд╣реЗрдВ AssetBundle рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдЧреЗ рд╣рдорд╛рд░реА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдЦ рдореЗрдВ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ :

habr.com/ru/post/282524
assetstore.unity.com/packages/add-ons/services/analytics/unity-analytics-remote-settings-89317

Source: https://habr.com/ru/post/hi436634/


All Articles