আমি আচরণ গাছের চারপাশে আমার মাথা নেওয়ার চেষ্টা করছি, তাই আমি কিছু পরীক্ষার কোডটি ছড়িয়ে দিচ্ছি। একটি জিনিস যার সাথে আমি লড়াই করছি তা হ'ল উচ্চতর অগ্রাধিকারের কিছু যখন আসে তখন কীভাবে চলমান নোডকে প্রশ্রয় দেওয়া যায়।
একজন সৈনিকের জন্য নিম্নলিখিত সহজ, কল্পিত আচরণ গাছটি বিবেচনা করুন:
মনে করুন যে কয়েকটি সংখ্যক টিকগুলি চলে গেছে এবং কাছে কোনও শত্রু নেই, সৈনিক ঘাসের উপর দাঁড়িয়ে ছিল, তাই সিট ডাউন নোডটি মৃত্যুদন্ড কার্যকর করার জন্য বেছে নেওয়া হয়েছে:
এখন সিট ডাউন অ্যাকশনটি কার্যকর করতে সময় নেয় কারণ খেলতে একটি অ্যানিমেশন রয়েছে, সুতরাং এটি Running
তার স্থিতি হিসাবে ফিরে আসে । দু'একটা টিক দিয়ে যায়, অ্যানিমেশনটি এখনও চলছে, তবে শত্রুটি কি কাছে? শর্ত নোড ট্রিগার। এখন আমাদের সিট ডাউন নোডকে ASAP প্রিম্পিট করতে হবে যাতে আমরা অ্যাটাক নোডটি কার্যকর করতে পারি । আদর্শভাবে সৈনিক এমনকি বসতেও শেষ করেনি - তিনি কেবলমাত্র বসতে শুরু করলে তার পরিবর্তে তার অ্যানিমেশন দিকটি বিপরীত হতে পারে। যুক্ত হওয়া বাস্তবতার জন্য, যদি সে অ্যানিমেশনের কোনও টিপিং পয়েন্টটি অতীত হয়, তবে আমরা তার পরিবর্তে তাকে বসে বসে আবার দাঁড়াতে বা বেছে নিতে পারি বা হুমকির প্রতিক্রিয়া জানাতে তার তড়িঘড়িতে হোঁচট খেতে পারি।
আমার যথাসাধ্য চেষ্টা করুন, আমি কীভাবে এই ধরণের পরিস্থিতি পরিচালনা করতে পারি তার দিকনির্দেশনা পেতে সক্ষম হইনি। গত কয়েক দিন ধরে আমি সমস্ত সাহিত্য এবং ভিডিও গ্রাস করেছি (এবং এটি অনেকটা হয়ে গেছে) এই সমস্যাটি দেখে মনে হচ্ছে। সর্বনিকটবর্তী বস্তু আমি খুঁজে পেতে সক্ষম চলেছি চলমান নোড পুনরায় সেট করার এই ধারণা হয়েছে, কিন্তু যে ভালো নোড দেয় না বসতে বলার একটা সুযোগ "আরে, আমি এখনও সম্পন্ন না করেছি!"
আমি আমার বেস ক্লাসে সম্ভবত একটি Preempt()
বা Interrupt()
পদ্ধতি সংজ্ঞায়নের কথা ভেবেছিলাম Node
। বিভিন্ন নোড এটিকে কীভাবে ফিট করে তা হ্যান্ডেল করতে পারে তবে এই ক্ষেত্রে আমরা সৈনিকটিকে তার পায়ে ফিরে এএসএপ ফিরিয়ে নেওয়ার চেষ্টা করব এবং তারপরে ফিরে আসব 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()
সক্রিয় নোডগুলি থেকে বেরিয়ে আসার আগে কিছু কলব্যাক কল করা )