示例#1
0
 private void OnDisable()
 {
     BehaviourEditorWindow.Save(null);
 }
        /// <summary>
        /// Create all the Behaviour objects from its json string.
        /// </summary>
        /// <param name="behaviour"></param>
        public static void Serialize(this EliotBehaviour behaviour)
        {
            behaviour.Nodes             = new List <Node>();
            BehaviourEditorWindow.Nodes = new List <Node>();
            var jObj   = new JsonObject(behaviour.Json);
            var jNodes = jObj["nodes"].Objects;

            if (jNodes == null)
            {
                behaviour.Nodes             = new List <Node>();
                behaviour.Transitions       = new List <NodesTransition>();
                BehaviourEditorWindow.Nodes = behaviour.Nodes;
                BehaviourEditorWindow.Clear(null);
            }
            else
            {
                if (jNodes.Count > 0)
                {
                    foreach (var node in jNodes)
                    {
                        behaviour.Nodes.Add(BehaviourEditorWindow.TemplateNode(((JsonObject)node)["type"].String).Serialize((JsonObject)node));
                    }
                }

                behaviour.Transitions = new List <NodesTransition>();
                var jTransitions = jObj["transitions"].Objects;
                foreach (var trans in jTransitions)
                {
                    var transition = (JsonObject)trans;
                    if (transition["startID"] == null)
                    {
                        break;
                    }
                    var   startId = transition["startID"].Int;
                    var   endId = transition["endID"].Int;
                    var   isNeg = transition["type"].String.Equals("negative");
                    int   minRate, maxRate;
                    float minCooldown, maxCooldown;
                    bool  terminate;
                    try
                    {
                        minRate     = transition["minRate"].Int;
                        maxRate     = transition["maxRate"].Int;
                        minCooldown = transition["minCooldown"].Float;
                        maxCooldown = transition["maxCooldown"].Float;
                        terminate   = transition["terminate"].Bool;
                    }
                    catch (Exception)
                    {
                        minRate     = 1;
                        maxRate     = 1;
                        minCooldown = 0f;
                        maxCooldown = 0f;
                        terminate   = false;
                    }

                    var color  = BehaviourEditorWindow.NeutralColor;
                    var tColor = transition["color"];
                    if (tColor != null)
                    {
                        var r = transition["color"]["r"].Float;
                        var g = transition["color"]["g"].Float;
                        var b = transition["color"]["b"].Float;
                        var a = Mathf.Clamp(1f / (maxRate * 0.2f) + 0.2f, 0.5f, 2f);
                        color = new Color(r, g, b, a);
                    }

                    var t = BehaviourEditorWindow.TemplateTransition();
                    t.Start       = behaviour.Nodes[startId];
                    t.End         = behaviour.Nodes[endId];
                    t.IsNegative  = isNeg;
                    t.MinRate     = minRate;
                    t.MaxRate     = maxRate;
                    t.MinCooldown = minCooldown;
                    t.MaxCooldown = maxCooldown;
                    t.Terminate   = terminate;
                    t.Color       = color;
                    behaviour.Nodes[startId].Transitions.Add(t);
                    behaviour.Transitions.Add(t);
                }

                BehaviourEditorWindow.Nodes = behaviour.Nodes;
            }
        }