だから私はこのデータ構造を数日間書いてきましたが、今ではそれが実際に何であるかについて非常に興味があり、私のロジックについての批評を得たいと思っています.
この使用法に基づくブランチは、参照されている同じタイプのノードが HEAD ノードに少なくとも 1 つ含まれている場合に存在します。
構造の目的は、タイプごとに配置されたブランチを持つことです。ブランチの各ノードには、ブランチの次のノード (常に同じタイプ) への参照と、サブデータ ブランチへのエントリ ポイントがあります。この場合のサブデータは、AchievementNode から継承するオブジェクトのインスタンスです。サブデータが追加され、そのブランチで最初のサブデータである場合、HEAD タグが適用されます。さらに、含まれるデータのタイプのメタデータを含むタグも含まれます (typeof 呼び出しをバイパスするため)。
実装:
public abstract class AchievementNode : ScriptableObject
{
public enum NodeTypes
{
NONE = 0x0,
HEAD = 0x1,
TAIL = 0x2,
TYPE = 0x4,
DATA = 0x8,
LEVEL = 0x16,
GLOBAL = 0x32
}
public NodeTypes nodeType;
public AchievementNode nextOfType;
public AchievementNode headOfSubnode;
public void OnEnable ()
{
hideFlags = HideFlags.HideAndDontSave;
}
public virtual void Init(NodeTypes type, int enumData)
{
nodeType = type;
}
protected void AddNode(NodeTypes type, AchievementNode originNode, AchievementNode newNode)
{
//Create SubNode branch notch when types mismatch.
if((originNode.nodeType & type) != type)
{
//If Has subNode Data Run to the end and assign new node
if(originNode.headOfSubnode!=null)
{
newNode.nodeType = type | NodeTypes.TAIL;
AppendToTail(type,GetEndOfBranch(originNode.headOfSubnode),newNode);
}//Search for proper SubNodeTypes then add. Wicked Recursion warning here...
else if((originNode.headOfSubnode.nodeType & type) != type)
{
Debug.LogError("Do Gnarly Search To Find!");
return;
}//Doesn't have subnode... add new Subnode.
else
{
newNode.nodeType = type | NodeTypes.HEAD | NodeTypes.TAIL;
originNode.headOfSubnode = newNode;
}
}
else
{
//Add to the current branch
newNode.nodeType = type | NodeTypes.TAIL;
AppendToTail(type,GetEndOfBranch(originNode),newNode);
}
}
private void AppendToTail(NodeTypes type,AchievementNode tailNode, AchievementNode newNode)
{
if((tailNode.nodeType & NodeTypes.HEAD) == NodeTypes.HEAD)
{
tailNode.nodeType = tailNode.nodeType | type;
}
else
{
tailNode.nodeType = type;
}
tailNode.nextOfType = newNode;
}
protected AchievementNode GetEndOfBranch(AchievementNode currentNode)
{
//Special Case where Node is HEAD and TAIL.
if((currentNode.nextOfType.nodeType & NodeTypes.TAIL) != NodeTypes.TAIL)
{
return GetEndOfBranch(currentNode.nextOfType);
}
else
{
return currentNode;
}
}
protected void SetType(NodeTypes type)
{
nodeType = type;
}
protected virtual AchievementNode FindInHierarchy(NodeTypes nodeCheck, AchievementNode currentNode)
{
if(currentNode == null)
{
return null;
}
else if((currentNode.nodeType & nodeCheck) == nodeCheck)
{
return currentNode;
}
else
{
return FindInHierarchy(nodeCheck,currentNode.nextOfType);
}
}
}
これをチェックするために時間を割いていただきありがとうございます。それは多くのことを意味します。