मैं व्यवहार वृक्षों के आसपास अपना सिर लाने का प्रयास कर रहा हूं, इसलिए मैं कुछ परीक्षण कोड निकाल रहा हूं। एक चीज जो मैं संघर्ष कर रहा हूं वह यह है कि वर्तमान में चल रहे नोड को कैसे प्राथमिकता दी जाए जब कुछ उच्च प्राथमिकता के साथ आता है।
एक सैनिक के लिए निम्नलिखित सरल, काल्पनिक व्यवहार पेड़ पर विचार करें:
मान लीजिए कि कुछ टिक टिक गए हैं और पास में कोई दुश्मन नहीं है, सैनिक घास पर खड़ा था, इसलिए सिट डाउन नोड को निष्पादन के लिए चुना गया है:
अब बैठो कार्रवाई को निष्पादित करने में समय लगता है क्योंकि खेलने के लिए एक एनीमेशन है, इसलिए यह Running
इसकी स्थिति के रूप में वापस आता है । एक टिक या दो से जाता है, एनीमेशन अभी भी चल रहा है, लेकिन दुश्मन के पास? हालत नोड चलाता है। अब हमें एसिट डाउन नोड एएसएपी को पूर्व निर्धारित करने की आवश्यकता है ताकि हम हमला नोड को निष्पादित कर सकें । आदर्श रूप से सिपाही नीचे बैठकर भी पूरा नहीं करेगा - वह अपनी एनिमेशन दिशा को उलट सकता है यदि वह केवल बैठना शुरू कर दे। अतिरिक्त यथार्थवाद के लिए, यदि वह एनीमेशन में कुछ टिपिंग बिंदु से आगे है, तो हम उसके बजाय उसे नीचे बैठने के लिए चुन सकते हैं और उसके बाद फिर से खड़े हो सकते हैं, या शायद उसे धमकी पर प्रतिक्रिया देने के लिए जल्दबाजी में ठोकर खा सकते हैं।
जैसा मैं कर सकता हूं, कोशिश करें कि मैं इस तरह की स्थिति को संभालने के लिए मार्गदर्शन नहीं पा सका हूं। पिछले कुछ दिनों में जितने भी साहित्य और वीडियो मैंने खाए हैं (और यह बहुत हो चुके हैं) इस मुद्दे पर घिरे हुए हैं। निकटतम चीज़ जो मैं खोजने में सक्षम रहा हूँ, यह नोड्स को रीसेट करने की अवधारणा है, लेकिन इससे नोड्स को बैठने का मौका नहीं मिलता है "अरे, मैंने अभी तक काम नहीं किया है!"
मैंने शायद अपने आधार वर्ग पर एक विधि Preempt()
या Interrupt()
पद्धति को परिभाषित करने के बारे में सोचा Node
। अलग-अलग नोड्स इसे संभाल सकते हैं कि वे कैसे फिट देखते हैं, लेकिन इस मामले में हम सैनिक को अपने पैरों पर ASAP और फिर वापस लाने का प्रयास करेंगे Success
। मुझे लगता है कि इस दृष्टिकोण की भी आवश्यकता होगी कि मेरे आधार Node
में अन्य कार्यों के लिए अलग से शर्तों की अवधारणा है। इस तरह, इंजन केवल स्थितियों की जांच कर सकता है, और यदि वे पास हो जाते हैं, तो कार्रवाई के निष्पादन शुरू करने से पहले किसी भी समय निष्पादित नोड को पूर्व निर्धारित कर सकते हैं। यदि यह भेदभाव स्थापित नहीं किया गया था, तो इंजन को अंधाधुंध तरीके से नोड्स को निष्पादित करने की आवश्यकता होगी और इसलिए चल रहे एक को हटाने से पहले एक नई कार्रवाई को ट्रिगर कर सकता है।
संदर्भ के लिए, नीचे मेरी वर्तमान आधार कक्षाएं हैं। फिर से, यह एक स्पाइक है, इसलिए मैंने चीजों को यथासंभव सरल रखने का प्रयास किया है और जब मुझे इसकी आवश्यकता होती है तो केवल जटिलता को जोड़ता है, और जब मैं इसे समझता हूं, जो कि मैं अभी से संघर्ष कर रहा हूं।
public enum ExecuteResult
{
// node needs more time to run on next tick
Running,
// node completed successfully
Succeeded,
// node failed to complete
Failed
}
public abstract class Node<TAgent>
{
public abstract ExecuteResult Execute(TimeSpan elapsed, TAgent agent, Blackboard blackboard);
}
public abstract class DecoratorNode<TAgent> : Node<TAgent>
{
private readonly Node<TAgent> child;
protected DecoratorNode(Node<TAgent> child)
{
this.child = child;
}
protected Node<TAgent> Child
{
get { return this.child; }
}
}
public abstract class CompositeNode<TAgent> : Node<TAgent>
{
private readonly Node<TAgent>[] children;
protected CompositeNode(IEnumerable<Node<TAgent>> children)
{
this.children = children.ToArray();
}
protected Node<TAgent>[] Children
{
get { return this.children; }
}
}
public abstract class ConditionNode<TAgent> : Node<TAgent>
{
private readonly bool invert;
protected ConditionNode()
: this(false)
{
}
protected ConditionNode(bool invert)
{
this.invert = invert;
}
public sealed override ExecuteResult Execute(TimeSpan elapsed, TAgent agent, Blackboard blackboard)
{
var result = this.CheckCondition(agent, blackboard);
if (this.invert)
{
result = !result;
}
return result ? ExecuteResult.Succeeded : ExecuteResult.Failed;
}
protected abstract bool CheckCondition(TAgent agent, Blackboard blackboard);
}
public abstract class ActionNode<TAgent> : Node<TAgent>
{
}
क्या किसी के पास कोई अंतर्दृष्टि है जो मुझे सही दिशा में आगे बढ़ा सकती है? क्या मेरी सोच सही लाइनों के साथ है, या यह उतना ही भोला है जितना मुझे डर है?
Stop()
सक्रिय नोड्स से बाहर निकलने से पहले कुछ कॉलबैक कहते हैं)