Example #1
0
    private void CheckTransition(SkillHsmConfigTransition transition)
    {
        for (int i = transition.GroupList.Count - 1; i >= 0; --i)
        {
            SkillHsmConfigTransitionGroup group = transition.GroupList[i];
            bool validGroup = false;
            for (int j = group.ParameterList.Count - 1; j >= 0; --j)
            {
                string parameter = group.ParameterList[j];
                SkillHsmConfigHSMParameter hSMParameter = transition.ParameterList.Find(a => (a.ParameterName.CompareTo(parameter) == 0));
                if (null == hSMParameter)
                {
                    group.ParameterList.RemoveAt(j);
                    Debug.LogError("group ParameterList remove :" + parameter);
                }
                else
                {
                    validGroup = true;
                }
            }

            if (!validGroup)
            {
                transition.GroupList.RemoveAt(i);
                Debug.LogError("RemoveGroup :" + group.Index);
            }
        }
    }
Example #2
0
        private void SelectTransition()
        {
            Event   _event   = Event.current;
            Vector3 mousePos = _event.mousePosition;

            if (_event.type != EventType.MouseDown || (_event.button != 0)) // 鼠标左键
            {
                return;
            }

            for (int i = 0; i < _nodeList.Count; i++)
            {
                SkillHsmConfigNodeData nodeValue = _nodeList[i];

                for (int j = 0; j < nodeValue.TransitionList.Count; ++j)
                {
                    SkillHsmConfigTransition transition = nodeValue.TransitionList[j];
                    int toId = transition.ToStateId;
                    SkillHsmConfigNodeData toNode = HSMManager.Instance.GetNode(toId);
                    if (null == toNode)
                    {
                        continue;
                    }

                    int     transitionId = nodeValue.Id * 1000 + transition.TransitionId;
                    Vector3 startPos     = Vector3.zero;
                    Vector3 endPos       = Vector3.zero;
                    CalculateTranstion(nodeValue.Position, toNode.Position, ref startPos, ref endPos);

                    Vector3 AB       = endPos - startPos;
                    Vector3 AP       = mousePos - startPos;
                    Vector3 BP       = mousePos - endPos;
                    float   dotAP_AB = Vector3.Dot(AP, AB.normalized);
                    float   dotBP_BA = Vector3.Dot(BP, (AB * -1).normalized);
                    if (dotAP_AB < 0 || dotBP_BA < 0)
                    {
                        continue;
                    }

                    float distance = Vector3.Cross(AB, AP).magnitude / AB.magnitude;

                    bool value = (distance < 10) && (Mathf.Abs(dotAP_AB) < AB.magnitude);
                    if (value)
                    {
                        if (null != HSMManager.hSMChangeSelectTransitionId)
                        {
                            int id = nodeValue.Id * 1000 + transition.TransitionId;
                            HSMManager.hSMChangeSelectTransitionId(id);
                        }

                        if (null != HSMManager.hSMChangeSelectId)
                        {
                            HSMManager.hSMChangeSelectId(nodeValue.Id);
                        }
                    }
                    //float distance = Vector3.Cross(AB, AP).magnitude / AB.magnitude;
                    //return distance <= (sRadius + cRadius);
                }
            }
        }
Example #3
0
        public static SkillHsmConfigTransition Clone(this SkillHsmConfigTransition self)
        {
            SkillHsmConfigTransition newTransition = new SkillHsmConfigTransition();

            newTransition.CloneFrom(self);
            return(newTransition);
        }
Example #4
0
        public static void CloneFrom(this SkillHsmConfigTransition self, SkillHsmConfigTransition transition)
        {
            self.TransitionId = transition.TransitionId;
            self.ToStateId    = transition.ToStateId;

            for (int i = 0; i < transition.ParameterList.Count; ++i)
            {
                SkillHsmConfigHSMParameter parameter = transition.ParameterList[i];
                self.ParameterList.Add(parameter.Clone());
            }

            for (int i = 0; i < transition.GroupList.Count; ++i)
            {
                SkillHsmConfigTransitionGroup group = transition.GroupList[i];

                SkillHsmConfigTransitionGroup clone = new SkillHsmConfigTransitionGroup();
                clone.Index = group.Index;
                for (int j = 0; j < group.ParameterList.Count; ++j)
                {
                    clone.ParameterList.Add(group.ParameterList[j]);
                }

                self.GroupList.Add(clone);
            }
        }
Example #5
0
        public virtual void AddTransition(SkillHsmConfigTransition transition)
        {
            _transitionList.Add(transition);

            ConditionParameter conditionParametr = new ConditionParameter();

            conditionParametr.SetGroup(transition);
            _conditionParameterDic[transition.TransitionId] = conditionParametr;
        }
Example #6
0
 public void SetGroup(SkillHsmConfigTransition transition)
 {
     for (int i = 0; i < transition.GroupList.Count; ++i)
     {
         SkillHsmConfigTransitionGroup transitionGroup = transition.GroupList[i];
         TransitionGroupParameter      group           = GetParameter(transitionGroup, transition.ParameterList);
         groupList.Add(group);
     }
 }
Example #7
0
        private void DrawTransitionParameter(SkillHsmConfigNodeData nodeData, SkillHsmConfigTransition transition, string title)
        {
            EditorGUILayout.BeginVertical("box");
            {
                if (null != transition)
                {
                    SkillHsmConfigNodeData toNode = HSMManager.Instance.GetNode(transition.ToStateId);
                    string toNodeDescript         = (null != toNode) ? toNode.Descript : string.Empty;
                    string msg = string.Format("节点{0} -> 节点{1}", nodeData.Id, transition.ToStateId);
                    EditorGUILayout.LabelField(msg);
                }
            }
            EditorGUILayout.EndVertical();

            int transitionId = (null != transition) ? transition.TransitionId : -1;
            List <SkillHsmConfigHSMParameter> parametersList = (null != transition) ? transition.ParameterList : new List <SkillHsmConfigHSMParameter>();

            Action <SkillHsmConfigHSMParameter> DelCallBack = (hSMParameter) =>
            {
                if (null != HSMManager.hSMNodeAddDelParameter)
                {
                    HSMManager.hSMNodeAddDelParameter(nodeData.Id, transitionId, hSMParameter, false);
                }
            };

            Action <string> ChangeParameter = (parameterName) =>
            {
                if (null != HSMManager.hSMNodeChangeParameter)
                {
                    HSMManager.hSMNodeChangeParameter(nodeData.Id, transitionId, parameterName);
                }
            };

            SkillHsmConfigTransitionGroup group = null;

            EditorGUILayout.BeginVertical("box");
            {
                group = HSMTransitionGroup.DrawTransitionGroup(nodeData, transition);
                DrawTransitionAddGroup(nodeData, transitionId);
            }
            EditorGUILayout.EndVertical();

            for (int i = 0; i < parametersList.Count; ++i)
            {
                parametersList[i].Index = i;
            }
            DrawParameter(nodeData, parametersList, DelCallBack, ChangeParameter, group);

            GUILayout.Space(10);
            EditorGUILayout.BeginVertical("box");
            {
                DrawTransitionAddParameter(nodeData, transitionId);
            }
            EditorGUILayout.EndVertical();
        }
Example #8
0
 private void NodeDeleteTransition(SkillHsmConfigNodeData fromNode, SkillHsmConfigNodeData toNode)
 {
     for (int i = 0; i < fromNode.TransitionList.Count; ++i)
     {
         SkillHsmConfigTransition temp = fromNode.TransitionList[i];
         if (temp.ToStateId == toNode.Id)
         {
             fromNode.TransitionList.RemoveAt(i);
             break;
         }
     }
 }
Example #9
0
 public void CheckData(SkillHsmConfigHSMTreeData data)
 {
     for (int i = 0; i < data.NodeList.Count; ++i)
     {
         SkillHsmConfigNodeData nodeData = data.NodeList[i];
         for (int j = 0; j < nodeData.TransitionList.Count; ++j)
         {
             SkillHsmConfigTransition transition = nodeData.TransitionList[j];
             CheckTransition(transition);
         }
     }
 }
Example #10
0
    // 删除节点
    private void DeleteNode(int stateId)
    {
        SkillHsmConfigNodeData delNode = GetNode(stateId);

        if (null == delNode)
        {
            return;
        }

        List <SkillHsmConfigNodeData> delList = new List <SkillHsmConfigNodeData>()
        {
            delNode
        };

        GetNodeAllChild(stateId, ref delList);

        HashSet <int> delHash = new HashSet <int>();

        for (int i = 0; i < delList.Count; ++i)
        {
            delHash.Add(delList[i].Id);
            //Debug.LogError(delList[i].Id);
        }

        for (int i = NodeList.Count - 1; i >= 0; --i)
        {
            SkillHsmConfigNodeData nodeValue = NodeList[i];
            for (int j = 0; j < nodeValue.TransitionList.Count; ++j)
            {
                SkillHsmConfigTransition transition = nodeValue.TransitionList[j];
                if (delHash.Contains(transition.ToStateId))
                {
                    nodeValue.TransitionList.RemoveAt(j);
                }
            }

            for (int j = nodeValue.ChildIdList.Count - 1; j >= 0; --j)
            {
                int childId = nodeValue.ChildIdList[j];
                if (delHash.Contains(childId))
                {
                    nodeValue.ChildIdList.RemoveAt(j);
                }
            }

            if (delHash.Contains(nodeValue.Id))
            {
                NodeList.RemoveAt(i);
                //Debug.LogError("Remove:" + nodeValue.Id);
            }
        }
    }
Example #11
0
    private void NodeAddDelParameter(int stateId, int transitionId, SkillHsmConfigHSMParameter parameter, bool isAdd)
    {
        SkillHsmConfigNodeData nodeValue = GetNode(stateId);

        if (null == nodeValue)
        {
            return;
        }

        List <SkillHsmConfigHSMParameter> parameterList = new List <SkillHsmConfigHSMParameter>();

        if (transitionId >= 0)
        {
            SkillHsmConfigTransition transition = null;
            for (int i = 0; i < nodeValue.TransitionList.Count; ++i)
            {
                if (nodeValue.TransitionList[i].TransitionId == transitionId)
                {
                    transition = nodeValue.TransitionList[i];
                    break;
                }
            }

            if (null == transition)
            {
                return;
            }

            parameterList = transition.ParameterList;
        }
        else
        {
            parameterList = nodeValue.ParameterList;
        }

        if (isAdd)
        {
            AddParameter(parameterList, parameter, true);
        }
        else
        {
            DelParameter(parameterList, parameter);
        }

        for (int i = 0; i < parameterList.Count; ++i)
        {
            SkillHsmConfigHSMParameter p = parameterList[i];
            p.Index = i;
        }
    }
Example #12
0
        public static SkillHsmConfigHSMTreeData UpdateData(SkillHsmConfigHSMTreeData skillHsmData)
        {
            HashSet <string> useParameter = new HashSet <string>();

            for (int i = 0; i < skillHsmData.NodeList.Count; ++i)
            {
                SkillHsmConfigNodeData nodeData = skillHsmData.NodeList[i];
                for (int j = 0; j < nodeData.TransitionList.Count; ++j)
                {
                    SkillHsmConfigTransition transition = nodeData.TransitionList[j];

                    for (int k = 0; k < transition.GroupList.Count; ++k)
                    {
                        SkillHsmConfigTransitionGroup transitionGroup = transition.GroupList[k];
                        for (int n = 0; n < transitionGroup.ParameterList.Count; ++n)
                        {
                            string parameter = transitionGroup.ParameterList[n];
                            if (!useParameter.Contains(parameter))
                            {
                                useParameter.Add(parameter);
                            }

                            if (parameter.CompareTo("ForcedAbortSkill") == 0)
                            {
                                Debug.LogError(skillHsmData.FileName + "     ForcedAbortSkill:" + nodeData.Id + "    " + transition.ToStateId);
                            }

                            if (parameter.CompareTo("ForcedAbortSkillToFish") == 0)
                            {
                                Debug.LogError(skillHsmData.FileName + "     ForcedAbortSkillToFish:" + nodeData.Id + "    " + transition.ToStateId);
                            }
                        }
                    }
                }
            }

            for (int k = skillHsmData.ParameterList.Count - 1; k >= 0; --k)
            {
                SkillHsmConfigHSMParameter parameter = skillHsmData.ParameterList[k];
                if (!useParameter.Contains(parameter.ParameterName))
                {
                    Debug.LogError(skillHsmData.FileName + "    " + parameter.ParameterName + "    " + parameter.CNName);
                    skillHsmData.ParameterList.RemoveAt(k);
                }
            }

            return(skillHsmData);
        }
Example #13
0
        private bool SelectTransition(SkillHsmConfigNodeData nodeData, ref int id)
        {
            bool selectTransition = false;

            for (int i = 0; i < nodeData.TransitionList.Count; ++i)
            {
                SkillHsmConfigTransition temp = nodeData.TransitionList[i];
                selectTransition = (nodeData.Id * 1000 + temp.TransitionId) == HSMManager.Instance.CurrentTransitionId;
                if (selectTransition)
                {
                    id = temp.TransitionId;
                    break;
                }
            }

            return(selectTransition);
        }
Example #14
0
    private void NodeAddTransition(SkillHsmConfigNodeData fromNode, SkillHsmConfigNodeData toNode)
    {
        for (int i = 0; i < fromNode.TransitionList.Count; ++i)
        {
            SkillHsmConfigTransition temp = fromNode.TransitionList[i];
            if (temp.ToStateId == toNode.Id)
            {
                return;
            }
        }

        int transitionId = -1;

        for (int i = 0; i < fromNode.TransitionList.Count; ++i)
        {
            bool result = true;
            for (int j = 0; j < fromNode.TransitionList.Count; ++j)
            {
                SkillHsmConfigTransition temp = fromNode.TransitionList[j];
                if (i == temp.TransitionId)
                {
                    result = false;
                    break;
                }
            }

            if (result)
            {
                transitionId = i;
                break;
            }
        }

        if (transitionId == -1)
        {
            transitionId = fromNode.TransitionList.Count;
        }

        SkillHsmConfigTransition transition = new SkillHsmConfigTransition();

        transition.TransitionId = transitionId;
        transition.ToStateId    = toNode.Id;
        fromNode.TransitionList.Add(transition);
    }
Example #15
0
        /// <summary>
        /// 执行节点抽象方法
        /// </summary>
        /// <returns>返回执行结果</returns>
        public virtual int Execute(ref bool result)
        {
            result = false;
#if UNITY_EDITOR
            NodeNotify.NotifyExecute(NodeId, Time.realtimeSinceStartup);
#endif
            int toStateId = -1;
            for (int i = 0; i < _transitionList.Count; ++i)
            {
                SkillHsmConfigTransition transition         = _transitionList[i];
                ConditionParameter       conditionParameter = null;
                if (_conditionParameterDic.TryGetValue(transition.TransitionId, out conditionParameter))
                {
                    result = _iconditionCheck.Condition(conditionParameter);
                }
                if (result)
                {
                    toStateId = transition.ToStateId;
                    break;
                }
            }

            return(toStateId);
        }
Example #16
0
    private void NodeChangeParameter(int stateId, int transitionId, string newParameter)
    {
        SkillHsmConfigNodeData nodeValue = GetNode(stateId);

        if (null == nodeValue)
        {
            return;
        }

        SkillHsmConfigHSMParameter parameter = null;

        for (int i = 0; i < _HSMTreeData.ParameterList.Count; ++i)
        {
            SkillHsmConfigHSMParameter temp = _HSMTreeData.ParameterList[i];
            if (temp.ParameterName.CompareTo(newParameter) == 0)
            {
                parameter = temp;
            }
        }

        if (null == parameter)
        {
            return;
        }

        List <SkillHsmConfigHSMParameter> parameterList = new List <SkillHsmConfigHSMParameter>();

        if (transitionId >= 0)
        {
            SkillHsmConfigTransition transition = null;
            for (int i = 0; i < nodeValue.TransitionList.Count; ++i)
            {
                if (nodeValue.TransitionList[i].TransitionId == transitionId)
                {
                    transition = nodeValue.TransitionList[i];
                    break;
                }
            }

            if (null == transition)
            {
                return;
            }

            parameterList = transition.ParameterList;
        }
        else
        {
            parameterList = nodeValue.ParameterList;
        }

        for (int i = 0; i < parameterList.Count; ++i)
        {
            SkillHsmConfigHSMParameter temp = parameterList[i];
            if (temp.ParameterName.CompareTo(parameter.ParameterName) == 0)
            {
                parameterList[i] = parameter.Clone();
                break;
            }
        }

        for (int i = 0; i < parameterList.Count; ++i)
        {
            parameterList[i].Index = i;
        }
    }
Example #17
0
    private void NodeTransitionAddDelGroup(int stateId, int transitionId, int groupId, bool isAdd)
    {
        SkillHsmConfigNodeData nodeValue = GetNode(stateId);

        if (null == nodeValue)
        {
            return;
        }

        if (isAdd)
        {
            for (int i = 0; i < nodeValue.TransitionList.Count; ++i)
            {
                SkillHsmConfigTransition transition = null;
                if (nodeValue.TransitionList[i].TransitionId != transitionId)
                {
                    continue;
                }

                transition = nodeValue.TransitionList[i];

                for (int j = 0; j < transition.GroupList.Count + 1; ++j)
                {
                    SkillHsmConfigTransitionGroup transitionGroup = transition.GroupList.Find(a => a.Index == j);
                    if (null == transitionGroup)
                    {
                        transitionGroup       = new SkillHsmConfigTransitionGroup();
                        transitionGroup.Index = j;
                        transition.GroupList.Add(transitionGroup);
                        break;
                    }
                }

                if (transition.GroupList.Count <= 0)
                {
                    SkillHsmConfigTransitionGroup transitionGroup = new SkillHsmConfigTransitionGroup();
                    transitionGroup.Index = 0;
                    transition.GroupList.Add(transitionGroup);
                }
            }
        }
        else
        {
            for (int i = 0; i < nodeValue.TransitionList.Count; ++i)
            {
                SkillHsmConfigTransition transition = null;
                if (nodeValue.TransitionList[i].TransitionId != transitionId)
                {
                    continue;
                }

                transition = nodeValue.TransitionList[i];
                for (int j = 0; j < transition.GroupList.Count; ++j)
                {
                    if (transition.GroupList[j].Index == groupId)
                    {
                        transition.GroupList.RemoveAt(j);
                    }
                }
            }
        }
    }
Example #18
0
        private void DrawNode(SkillHsmConfigNodeData nodeData)
        {
            string selectTitle = string.Empty;

            int  selectTransitionId = -1;
            bool selectTransition   = SelectTransition(nodeData, ref selectTransitionId);

            selectNodeParameter = !selectTransition;
            GUI.backgroundColor = selectNodeParameter ? new Color(0, 1, 0, 1) : Color.white;//
            EditorGUILayout.BeginVertical("box");
            {
                bool oldValue = selectNodeParameter;
                selectNodeParameter = EditorGUILayout.Toggle(new GUIContent("节点参数"), selectNodeParameter);
                if ((!oldValue && selectNodeParameter) && HSMManager.Instance.CurrentTransitionId >= 0 && null != HSMManager.hSMChangeSelectTransitionId)
                {
                    HSMManager.hSMChangeSelectTransitionId(-1);
                }
            }
            EditorGUILayout.EndVertical();
            GUI.backgroundColor = Color.white;

            SkillHsmConfigTransition transition = null;

            EditorGUILayout.BeginVertical("box");
            {
                EditorGUILayout.LabelField("选择转换连线查看/添加/删除参数");
                for (int i = 0; i < nodeData.TransitionList.Count; ++i)
                {
                    SkillHsmConfigTransition temp = nodeData.TransitionList[i];
                    string name      = string.Format("转换条件参数:连线ID_{0}", temp.ToStateId);
                    bool   lastValue = (selectTransitionId == temp.TransitionId);
                    if (lastValue)
                    {
                        transition  = temp;
                        selectTitle = name;//string.Format("{0} 参数", name);
                    }

                    GUI.backgroundColor = lastValue ? new Color(0, 1, 0, 1) : Color.white;//
                    EditorGUILayout.BeginHorizontal("box");
                    {
                        GUIStyle guiStyle = new GUIStyle();
                        guiStyle.normal.textColor = lastValue ? Color.green : Color.black;
                        bool value = EditorGUILayout.Toggle(new GUIContent(name), lastValue);
                        if (value && !lastValue)
                        {
                            if (null != HSMManager.hSMChangeSelectTransitionId)
                            {
                                int id = nodeData.Id * 1000 + temp.TransitionId;
                                HSMManager.hSMChangeSelectTransitionId(id);
                            }
                        }

                        if (GUILayout.Button("复制"))
                        {
                            HSMManager.copyTransition = temp.Clone();
                        }

                        if (GUILayout.Button("粘贴"))
                        {
                            if (null != HSMManager.copyTransition)
                            {
                                HSMManager.copyTransition.TransitionId = temp.TransitionId;
                                HSMManager.copyTransition.ToStateId    = temp.ToStateId;
                                temp = HSMManager.copyTransition.Clone();
                                nodeData.TransitionList[i] = temp;
                                HSMManager.copyTransition  = null;
                            }
                        }

                        if (GUILayout.Button("删除"))
                        {
                            if (null != HSMManager.hSMNodeChangeTransition)
                            {
                                HSMManager.hSMNodeChangeTransition(nodeData.Id, temp.ToStateId, false);
                            }
                        }
                    }
                    EditorGUILayout.EndHorizontal();
                    GUI.backgroundColor = Color.white;
                }
            }
            EditorGUILayout.EndVertical();

            if (null != transition)
            {
                DrawTransitionParameter(nodeData, transition, selectTitle);
            }
            if (selectNodeParameter)
            {
                DrawNodeParameter(nodeData, selectTitle);
            }
        }