আচরণ গাছগুলি প্রেরিম্পিং


25

আমি আচরণ গাছের চারপাশে আমার মাথা নেওয়ার চেষ্টা করছি, তাই আমি কিছু পরীক্ষার কোডটি ছড়িয়ে দিচ্ছি। একটি জিনিস যার সাথে আমি লড়াই করছি তা হ'ল উচ্চতর অগ্রাধিকারের কিছু যখন আসে তখন কীভাবে চলমান নোডকে প্রশ্রয় দেওয়া যায়।

একজন সৈনিকের জন্য নিম্নলিখিত সহজ, কল্পিত আচরণ গাছটি বিবেচনা করুন:

এখানে চিত্র বর্ণনা লিখুন

মনে করুন যে কয়েকটি সংখ্যক টিকগুলি চলে গেছে এবং কাছে কোনও শত্রু নেই, সৈনিক ঘাসের উপর দাঁড়িয়ে ছিল, তাই সিট ডাউন নোডটি মৃত্যুদন্ড কার্যকর করার জন্য বেছে নেওয়া হয়েছে:

এখানে চিত্র বর্ণনা লিখুন

এখন সিট ডাউন অ্যাকশনটি কার্যকর করতে সময় নেয় কারণ খেলতে একটি অ্যানিমেশন রয়েছে, সুতরাং এটি 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>
{
}

কারও কি এমন অন্তর্দৃষ্টি আছে যা আমাকে সঠিক দিকে চালিত করতে পারে? আমার চিন্তাভাবনা কি সঠিক লাইন বরাবর, বা আমি যতটা ভয় করি তেমনি নিষ্পাপ?


আপনার এই দস্তাবেজটি একবার দেখতে হবে: chrishecker.com/My_liner_notes_for_spore/… এখানে তিনি ব্যাখ্যা করেছেন যে কীভাবে গাছটি চলছে, কোনও রাজ্য মেশিনের মতো নয়, তবে প্রতিটি টিকের মূল থেকে, যা প্রতিক্রিয়াশীলতার আসল কৌশল। বিটি-এর ব্যতিক্রম বা ইভেন্টের প্রয়োজন হবে না। তারা অভ্যন্তরীণভাবে পুলিং সিস্টেম রয়েছে এবং সব পরিস্থিতিতে মূল থেকে নীচে নেমে যাওয়ার জন্য সমস্ত পরিস্থিতিতে প্রতিক্রিয়া জানায়। কোনটি কীভাবে প্রাক্প্রটিভিটি কাজ করে, যদি উচ্চ অগ্রাধিকারের কোনও বাহ্যিক শর্ত পরীক্ষা করে এটি সেখানে প্রবাহিত হয়। ( Stop()সক্রিয় নোডগুলি থেকে বেরিয়ে আসার আগে কিছু কলব্যাক কল করা )
v.oddou

এই aigamedev.com/open/article/popular-behavers-tree- ডিজাইন এছাড়াও খুব সুন্দরভাবে বিস্তারিত
v.oddou

উত্তর:


6

আমি নিজেকে আপনার মত একই প্রশ্ন জিজ্ঞাসা করতে দেখেছি এবং এই ব্লগ পৃষ্ঠার মন্তব্য বিভাগে আমার দুর্দান্ত সংক্ষিপ্ত কথোপকথন হয়েছে যেখানে আমাকে সমস্যার অন্য সমাধান দেওয়া হয়েছিল।

প্রথম জিনিসটি সমবর্তী নোড ব্যবহার করা হয়। সমকালীন নোড একটি বিশেষ ধরণের যৌগিক নোড is এটি পূর্বশর্ত পরীক্ষার ক্রম সহ একক অ্যাকশন নোড অনুসরণ করে। এটি অ্যাকশন নোডটি 'চলমান' অবস্থায় থাকলেও সমস্ত শিশু নোড আপডেট করে। (সিকোয়েন্স নোডের বিপরীতে যা চলমান চাইল্ড নোড থেকে এটি আপডেট হওয়া উচিত))

মূল ধারণাটি হ'ল অ্যাকশন নোডের জন্য আরও দুটি রিটার্নের রাজ্য তৈরি করা: "বাতিল করা" এবং "বাতিল"।

সাম্প্রতিক নোডে পূর্বশর্ত চেকের ব্যর্থতা এমন একটি প্রক্রিয়া যা এটির ক্রিয়াকলাপটি চালিয়ে যাওয়ার বাতিল করে দেয়। যদি অ্যাকশন নোডটির দীর্ঘমেয়াদে বাতিল হওয়া যুক্তি প্রয়োজন না হয় তবে তা অবিলম্বে 'বাতিল' ফিরে আসবে। অন্যথায় এটি 'বাতিল' অবস্থায় চলে যায় যেখানে আপনি ক্রিয়াটির সঠিক ব্যাঘাতের জন্য প্রয়োজনীয় সমস্ত যুক্তি রাখতে পারেন।


হ্যালো এবং জিডিএসই তে স্বাগতম এটি দুর্দান্ত হবে, যদি আপনি সেই উত্তরটি ব্লগ থেকে এখানে এবং শেষের দিকে সেই ব্লগটিতে খুলতে পারেন। লিঙ্কগুলি এখানে মরতে থাকে, এখানে সম্পূর্ণরূপে উত্তর থাকা, এটি আরও স্থির করে তোলে। প্রশ্নে এখন 8 টি ভোট রয়েছে, সুতরাং উত্তরের উত্তরটি দুর্দান্ত।
কাতু

আমি মনে করি না যে এমন কিছু যা আচরণ গাছগুলিকে সীমাবদ্ধ রাষ্ট্রীয় মেশিনে ফিরিয়ে আনবে এটি একটি ভাল সমাধান। আপনার মতামতটি আমার কাছে মনে হচ্ছে আপনার প্রতিটি রাজ্যের সমস্ত প্রস্থান পরিস্থিতি কল্পনা করা দরকার। এই আসলে এফএসএম এর অপূর্ণতা যখন! বিটিটির মূলটি আবার শুরু করার সুবিধা রয়েছে, এটি পুরোপুরি সংযুক্ত এফএসএম তৈরি করে, আমাদের স্পষ্টতই প্রস্থান পরিস্থিতি লিখতে এড়িয়ে চলে।
v.oddou

5

আমি মনে করি আপনার সৈনিকটি মন এবং দেহে (এবং অন্য যে কোনও কিছুতেই) বিশৃঙ্খলা হতে পারে। এরপরে, দেহটি পা এবং হাতে পচে যেতে পারে। তারপরে, উচ্চ বা নিম্ন স্তরের অংশগুলির অনুরোধগুলির জন্য - প্রতিটি অংশের নিজস্ব আচরণ গাছ এবং সর্বজনীন ইন্টারফেসের প্রয়োজন হয়।

সুতরাং, প্রতিটি অ্যাকশনকে মাইক্রো ম্যানেজ করার পরিবর্তে, আপনি কেবল "বডি, কিছু সময়ের জন্য বসে" বা "বডি, সেখানে চালান" এর মতো তাত্ক্ষণিক শট বার্তা প্রেরণ করেন এবং দেহ অ্যানিমেশন, রাষ্ট্রের রূপান্তর, বিলম্ব এবং অন্যান্য সামগ্রী পরিচালনা করবে আপনি.

বিকল্পভাবে, দেহ নিজের মতো করে আচরণগুলি পরিচালনা করতে পারে। যদি এর কোনও আদেশ না থাকে তবে এটি মনে জিজ্ঞাসা করতে পারে "আমরা কি এখানে বসতে পারি?"। আরও মজার বিষয় হল, এনক্যাপসুলেশনের কারণে, আপনি সহজে ক্লান্তি বা স্তম্ভের মতো বৈশিষ্ট্যগুলি মডেল করতে পারেন।

আপনি এমনকি অংশগুলি বিনিময় করতে পারেন - জম্বি বুদ্ধি দিয়ে হাতি তৈরি করুন, মানুষের ডানা যুক্ত করুন (তিনি এমনকি খেয়াল করবেন না), বা অন্য যাই হোক না কেন।

এর মতো ক্ষয় না করেই আমি বাজি ধরছি যে আপনি খুব শীঘ্রই বা পরে মিশ্রিত বিস্ফোরণের ঝুঁকিতে রয়েছেন।

এছাড়াও: http://www.valvesoftware.com/publications/2009/ai_systems_of_l4d_mike_booth.pdf


ধন্যবাদ। আপনার উত্তরটি 3 বার পড়ার পরে, আমি মনে করি আমি বুঝতে পেরেছি। আমি এই পিডিএফ এই সপ্তাহান্তে পড়ব।
আমি--

1
গত এক ঘন্টা ধরে এই বিষয়ে চিন্তা করেও, আমি নিশ্চিত নই যে মন এবং শরীরের জন্য সম্পূর্ণ পৃথক বিটি তৈরির মধ্যে একটি বিটি বনাম যা উপ-গাছগুলিতে বিভক্ত হয়ে গেছে (বিল্ড-টাইম স্ক্রিপ্টগুলির সাথে একটি বিশেষ সাজসজ্জার মাধ্যমে উল্লেখ করা) একসাথে এক বিটি বিটিতে সবকিছু বেঁধে রাখা)। আমার কাছে মনে হচ্ছে এটি অনুরূপ বিমূর্ততা বেনিফিট সরবরাহ করবে এবং প্রদত্ত সত্তা কীভাবে আচরণ করে তা বুঝতে এটি আরও সহজ করে তুলতে পারে কারণ আপনাকে একাধিক পৃথক বিটিগুলিকে দেখতে হবে না। তবে আমি বোধহয় নিরীহ হয়ে যাচ্ছি।
আমি--

@ ব্যবহারকারী ১৩৪৪৪ পার্থক্যটি হ'ল গাছ তৈরি করার জন্য আপনার বিশেষ স্ক্রিপ্টগুলির প্রয়োজন হবে যখন কেবল পরোক্ষ অ্যাক্সেস ব্যবহার করার সময় (যেমন যখন বডি নোড অবশ্যই তার গাছটিকে জিজ্ঞাসা করে যে কোন বস্তু পায়ে প্রতিনিধিত্ব করে) যথেষ্ট পরিমাণে থাকতে পারে এবং কোনও অতিরিক্ত ব্রেইনফাক লাগবে না। কম কোড, কম ত্রুটি। এছাড়াও, রানটাইমে আপনি (সহজেই) সাবট্রিটি স্যুইচ করার ক্ষমতা হারাবেন। এমনকি আপনার যদি এ জাতীয় নমনীয়তা প্রয়োজন না হয় তবে আপনি কোনও কিছুই হারাবেন না (কার্যকর করার গতি সহ)।
ছায়াছবি বৃষ্টি

3

গতরাতে বিছানায় শুয়ে আমি আমার প্রশ্নটির দিকে ঝুঁকে যাচ্ছিলাম এমন জটিলতার পরিচয় না দিয়ে কীভাবে আমি এই বিষয়ে যেতে পারি সে সম্পর্কে আমার একটি এপিফ্যানির কিছু ছিল। এটিতে (খারাপ নামকরণ করা, আইএমএইচও) "সমান্তরাল" সংমিশ্রণ ব্যবহার জড়িত। আমি যা ভাবছি তা এখানে:

এখানে চিত্র বর্ণনা লিখুন

আশা করি এটি এখনও মোটামুটি পাঠযোগ্য। গুরুত্বপূর্ণ বিষয়গুলি হ'ল:

  • বসতে / বিলম্ব / দাঁড়ানো ক্রম একটি সমান্তরাল ক্রম (মধ্যে একটি ক্রম একটি )। প্রতিটি টিকের উপর, সমান্তরাল ক্রম শত্রু কাছাকাছি অবস্থার (উল্টানো) পরীক্ষা করেও । যদি শত্রু হয় কাছাকাছি শর্তে ব্যর্থ হয় এবং তাই খুব সমগ্র সমানত্মরাল সনি্নবেশ করে (অবিলম্বে, এমনকি যদি সন্তান ক্রম মাঝপথে হয় বসে থাক নিচে , বিলম্বিত বা দাঁড়ানো )
  • ব্যর্থতার পরে, সমান্তরাল ক্রমের উপরে নির্বাচক বি বাধা সামলানোর জন্য সিলেক্টর সি তে নেমে আসবে । গুরুত্বপূর্ণভাবে, সমান্তরাল ক্রম সফলভাবে সম্পন্ন হলে নির্বাচক সি চলবে না
  • সিলেক্টর সি তখন সাধারণভাবে উঠে দাঁড়ানোর চেষ্টা করেন, তবে সৈনিকটি যদি এখন খুব বিশ্রী অবস্থায় কেবল দাঁড়ানোর মতো অবস্থানে থাকে তবে এটি হোঁচট খেয়ে অ্যানিমেশনটিও ট্রিগার করতে পারে select

আমি ধারণা করেছি যে এটি কাজ করবে (শীঘ্রই আমার স্পাইকের মধ্যে এটি চেষ্টা করব), আমি কল্পনা করেছিলাম বলে কিছুটা অগোছালো হওয়া সত্ত্বেও। ভাল জিনিস হ'ল আমি শেষ পর্যন্ত উপ-গাছগুলিকে পুনরায় ব্যবহারযোগ্য যুক্তির টুকরো হিসাবে সজ্জিত করতে সক্ষম হবো এবং একাধিক পয়েন্ট থেকে সেগুলি উল্লেখ করব। এটি আমার বেশিরভাগ উদ্বেগকে হ্রাস করবে, সুতরাং আমি মনে করি এটি একটি কার্যকর সমাধান।

অবশ্যই, আমি এখনও শুনতে আগ্রহী যে এটি সম্পর্কে কারও কোনও ধারণা আছে কিনা।

আপডেট : যদিও এই পদ্ধতিটি প্রযুক্তিগতভাবে কাজ করে তবে আমি এটি ঠিক করে ফেলেছি। এর কারণ সম্পর্কিত নয় যে সম্পর্কহীন উপ-গাছগুলিকে গাছের অন্যান্য অংশে সংজ্ঞায়িত শর্তাদি সম্পর্কে "জানা" দরকার যাতে তারা নিজের মৃত্যুতে ট্রিগার করতে পারে। উপ-গাছের রেফারেন্সগুলি ভাগ করে নেওয়া এই ব্যথা উপশম করতে কিছুটা হলেও এগিয়ে যাবে, আচরণ গাছটি দেখার সময় এটি যেটি প্রত্যাশা করে তার বিপরীতে। সত্যিই, আমি খুব সাধারণ স্পাইকটিতে দুবার একই ভুল করেছি।

অতএব, আমি অন্য পথে যেতে যাচ্ছি: অবজেক্ট মডেলের মধ্যে প্রিম্পিংয়ের জন্য স্পষ্ট সমর্থন, এবং একটি বিশেষ সংমিশ্রণ যা প্রিম্পশন ঘটলে বিভিন্ন ক্রিয়াকলাপ কার্যকর করতে দেয়। আমার কিছু কাজ করার সময় আমি একটি পৃথক উত্তর পোস্ট করব।


1
আপনি যদি সত্যিই সাবট্রিজগুলি পুনরায় ব্যবহার করতে চান তবে কখন বাধা দেবেন ("এখানে শত্রুর কাছাকাছি") যুক্তিটি সম্ভবত সাবট্রির অংশ না হওয়া উচিত। পরিবর্তে সম্ভবত উচ্চতর অগ্রাধিকারের উদ্দীপনাজনিত কারণে সিস্টেম কোনও সাবট্রি (উদাহরণস্বরূপ বি এখানে) নিজেকে বিঘ্নিত করতে বলবে, এবং এটি তখন একটি বিশেষ চিহ্নিত চিহ্নিত বাধা নোডে (সি এখানে) প্রবেশ করবে যা অক্ষরটিকে কিছু স্ট্যান্ডার্ড অবস্থায় ফিরিয়ে আনবে would , যেমন দাঁড়ানো। কিছুটা ব্যতিক্রম হ্যান্ডলিংয়ের সমতুল্য আচরণ গাছের মতো।
নাথান রিড

1
উদ্দীপনা কোনটি বাধা দিচ্ছে তার উপর নির্ভর করে আপনি একাধিক বাধা হ্যান্ডলার সংযুক্ত করতে পারেন। উদাহরণস্বরূপ, যদি এনপিসি বসে থাকে এবং আগুন নেভানো শুরু করে, আপনি তাকে দাঁড়াতে চান না (এবং একটি বৃহত্তর লক্ষ্য উপস্থাপন করতে) বরং কভারের জন্য কম থাকুন এবং স্ক্র্যামবল থাকুন।
নাথন রিড

@ নাথান: মজার আপনি "ব্যতিক্রম হ্যান্ডলিং" সম্পর্কে উল্লেখ করেছেন। গত রাতে আমি প্রথম সম্ভাব্য পন্থাটি ভেবেছিলাম একটি প্রিমিপ কম্পোজিটের এই ধারণাটি ছিল, যার দুটি বাচ্চা থাকবে: একটি সাধারণ মৃত্যুদন্ডের জন্য, এবং একটি প্রিম্পটেড মৃত্যুদন্ডের জন্য। যদি সাধারণ শিশু পাস হয় বা ব্যর্থ হয়, তবে ফলাফলটি প্রচার করে। প্রিমিপশনটি ঘটে তবেই প্রিমিটি শিশুটি চলবে। সমস্ত নোডের একটি Preempt()পদ্ধতি থাকবে যা গাছের মধ্য দিয়ে ছড়িয়ে পড়বে। তবে, সত্যই "হ্যান্ডেল" করার একমাত্র জিনিসটি হ'ল প্রিমিট কম্পোজিট, যা তাত্ক্ষণিকভাবে তার প্রিমিট চাইল্ড নোডে স্যুইচ করবে।
আমি--

তারপরে আমি সমান্তরাল পদ্ধতির কথা ভেবেছিলাম যা আমি উপরে বর্ণিত করেছি এবং এটি আরও মার্জিত বলে মনে হয়েছে কারণ এপিআই জুড়ে অতিরিক্ত ক্রাফ্টের প্রয়োজন নেই। উপ-গাছগুলিকে আবদ্ধ করার বিষয়ে আপনার বক্তব্য, আমি মনে করি যেখানেই জটিলতা দেখা দেয়, এটি সম্ভাব্য প্রতিস্থাপনের পয়েন্ট হবে। এটি এমনও হতে পারে যেখানে আপনার বেশ কয়েকটি শর্ত থাকে যা প্রায়শই একসাথে চেক করা হয়। সেক্ষেত্রে প্রতিস্থাপনের মূলটি হ'ল একটি ক্রম সংমিশ্রণ হবে, যার একাধিক শর্ত তার সন্তান হিসাবে রয়েছে।
আমি--

আমি মনে করি সাবট্রিগুলি কার্যকর করার আগে তাদের "হিট" করার প্রয়োজনীয় শর্তগুলি জেনে নিখুঁতভাবে উপযুক্ত কারণ এটি তাদের স্ব-র অন্তর্ভুক্ত করে এবং খুব স্পষ্টভাবে বনাম অন্তর্নিহিত করে তোলে। যদি এটি আরও বড় উদ্বেগ হয় তবে শর্তগুলি সাবট্রির মধ্যে রাখবেন না, তবে এর "কল সাইট" এ রাখুন।
Seivan

2

আপাতত আমি যে সমাধানটি স্থির করেছি তা এখানে রয়েছে ...

  • আমার বেস Nodeক্লাসে একটি Interruptপদ্ধতি রয়েছে যা ডিফল্টরূপে কিছুই করে না
  • শর্তগুলি হ'ল "প্রথম শ্রেণির" কনস্ট্রাক্টস, যাতে তাদের ফিরে আসার প্রয়োজন হয় bool(এইভাবে বোঝানো হয় যে তারা কার্যকর করার জন্য দ্রুত এবং কখনও একের বেশি আপডেটের প্রয়োজন হয় না)
  • Node চাইল্ড নোডগুলির সংগ্রহের জন্য পৃথকভাবে শর্তগুলির সংগ্রহ প্রকাশ করে exp
  • Node.Executeপ্রথমে সমস্ত শর্ত কার্যকর করে এবং কোনও শর্ত ব্যর্থ হলে সরাসরি তা ব্যর্থ হয়। যদি শর্তগুলি সফল হয় (বা কোনও কিছুই নেই), এটি কল করে ExecuteCoreযাতে সাবক্লাস তার প্রকৃত কাজটি করতে পারে। এমন একটি প্যারামিটার রয়েছে যা শর্তগুলি এড়িয়ে যাওয়ার অনুমতি দেয়, কারণগুলির জন্য আপনি নীচে দেখতে পাবেন
  • Nodeএছাড়াও শর্তাদি কোনও CheckConditionsপদ্ধতির মাধ্যমে বিচ্ছিন্নভাবে সম্পাদন করার অনুমতি দেয় । অবশ্যই যখন শর্তগুলি বৈধ করার প্রয়োজন হয় তখন Node.Executeকেবলমাত্র কলগুলি হয়CheckConditions
  • আমার Selectorযৌগিক এখন CheckConditionsপ্রতিটি শিশুকে মৃত্যুদন্ড কার্যকর করার জন্য বিবেচনা করে for শর্তগুলি ব্যর্থ হলে এটি সরাসরি পরবর্তী সন্তানের সাথে সরানো হয়। যদি তারা পাস করে তবে এটি ইতিমধ্যে কার্যকরকারী শিশু রয়েছে কিনা তা পরীক্ষা করে। যদি Interruptতা হয় তবে এটি কল করে এবং ব্যর্থ হয়। এই মুহুর্তে এটি কেবল এটিই করতে পারে, এই আশায় যে বর্তমানে চলমান নোড বিঘ্নিত অনুরোধটির প্রতিক্রিয়া জানাবে, যা এটি এর মাধ্যমে করতে পারে ...
  • আমি একটি Interruptibleনোড যুক্ত করেছি , এটি বিশেষ ধরণের সাজসজ্জারকারীর মতো কারণ এটির সজ্জিত শিশু হিসাবে নিয়মিত যুক্তির প্রবাহ এবং তারপরে বাধাগুলির জন্য পৃথক নোড রয়েছে। এটি তার নিয়মিত শিশুটিকে যতক্ষণ না বাধা দেয় ততক্ষণ সম্পূর্ণ বা ব্যর্থতায় কার্যকর করে। যদি এটি বাধা দেয় তবে তা অবিলম্বে তার বাধা হ্যান্ডলিং চাইল্ড নোড কার্যকর করতে স্যুইচ করে, যা প্রয়োজন মতো সাব-ট্রি হিসাবে জটিল হতে পারে

শেষ ফলাফলটি আমার স্পাইক থেকে নেওয়া এমন কিছু:

এখানে চিত্র বর্ণনা লিখুন

উপরেরটি একটি মৌমাছির জন্য আচরণ গাছ, যা অমৃত সংগ্রহ করে এবং এটি তার পোঁদে ফিরিয়ে দেয়। যখন এর কোনও অমৃত না থাকে এবং কিছু ফুলের কাছে না থাকে তবে এটি ঘুরে বেড়ায়:

এখানে চিত্র বর্ণনা লিখুন

যদি এই নোড বাধাপ্রাপ্ত না হয় তবে এটি কখনই ব্যর্থ হবে না, তাই মৌমাছি স্থিরভাবে বিচরণ করত। তবে, যেহেতু প্যারেন্ট নোড একটি নির্বাচক এবং এতে উচ্চ অগ্রাধিকার প্রাপ্ত শিশু রয়েছে, তাই মৃত্যুদণ্ড কার্যকর করার জন্য তাদের যোগ্যতা ক্রমাগত যাচাই করা হচ্ছে। যদি তাদের শর্তগুলি পাস হয়ে যায়, বাছাইকারী বাধা দেয় এবং উপরের উপ-গাছটি তত্ক্ষণাত্ "বাধাপ্রাপ্ত" পথে স্যুইচ করে, যা ব্যর্থ হয়ে ASAPটিকে কেবল বিল করে দেয়। এটি অবশ্যই প্রথমে কিছু অন্যান্য ক্রিয়া সম্পাদন করতে পারে তবে আমার স্পাইকটিতে জামিন ব্যতীত অন্য কিছু করার দরকার নেই really

যদিও এটিকে আমার প্রশ্নের সাথে যুক্ত করতে, আপনি কল্পনা করতে পারেন যে "বাধাপ্রাপ্ত" পথটি বসার অ্যানিমেশনটিকে বিপরীত করার চেষ্টা করতে পারে এবং এটি ব্যর্থ হয়ে সৈনিককে হোঁচট খেতে পারে। এই সবগুলিই উচ্চ অগ্রাধিকারের অবস্থাতে স্থানান্তরকে ধরে রাখবে এবং লক্ষ্যটি কী তা অবিকল ছিল।

আমি মনে করি আমি এই পদ্ধতির সাথে বিশেষত খুশি - বিশেষত মূল টুকরোগুলি যা আমি উপরে বর্ণিত করেছি - তবে সত্যি বলতে কী, এটি শর্ত এবং ক্রিয়াকলাপগুলির নির্দিষ্ট বাস্তবায়নের বিস্তার এবং অ্যানিমেশন সিস্টেমে আচরণ গাছকে বাঁধা সম্পর্কে আরও প্রশ্ন উত্থাপন করেছে। আমি এখনও নিশ্চিত নই যে আমি এই প্রশ্নগুলি এখনও স্পষ্ট করে বলতে পারি, তাই আমি চিন্তাভাবনা / স্পিকিং চালিয়ে যাব।


1

আমি "কখন" ডেকরেটার আবিষ্কার করে একই বিষয়টি ঠিক করেছি। এটির একটি শর্ত এবং দুটি সন্তানের আচরণ ("তখন" এবং "অন্যথায়") রয়েছে। "কখন" কার্যকর করা হয়, এটি শর্ত পরীক্ষা করে এবং এর ফলাফলের উপর নির্ভর করে তখন / অন্যথায় বাচ্চা চালায়। যদি শর্তের ফলাফল পরিবর্তিত হয়, চলমান শিশুটিকে পুনরায় সেট করা হয় এবং অন্যান্য শাখার সাথে সম্পর্কিত শিশু শুরু করা হয়। যদি শিশু মৃত্যুদন্ড কার্যকর করে, পুরো "কখন" মৃত্যুদণ্ড কার্যকর করে।

মূল বক্তব্যটি হ'ল এই প্রশ্নের প্রাথমিক বিটি-র বিপরীতে যেখানে শর্তটি কেবল সিক্যুয়েন্স শুরুর সময়ই পরীক্ষা করা হয়, আমার "কখন" শর্তটি চলমান অবস্থায় চালিয়ে যায়। সুতরাং, আচরণ গাছের শীর্ষটি প্রতিস্থাপন করা হয়েছে:

When[EnemyNear]
  Then
    AttackSequence
  Otherwise
    When[StandingOnGrass]
      Then
        IdleSequence
      Otherwise
        Hum a tune

আরও উন্নত "যখন" ব্যবহারের জন্য, কেউ "অপেক্ষা করুন" ক্রিয়াটিও প্রবর্তন করতে চাইবে যা নির্দিষ্ট সময়ের জন্য বা অনির্দিষ্টকালের জন্য কিছুই করে না (পিতামাতার আচরণের মাধ্যমে পুনরায় সেট করা পর্যন্ত)। এছাড়াও, যদি আপনার "যখন" এর একটি মাত্র শাখা প্রয়োজন হয়, অন্য একটিতে "সাফল্য" বা "ব্যর্থ" ক্রিয়া থাকতে পারে, যা সম্পর্কিতটি সফল হয় এবং সাথে সাথে ব্যর্থ হয়।


আমি মনে করি বিটি-র মূল উদ্ভাবকরা যা মনে রেখেছিলেন, তার থেকে এই পদ্ধতির আরও কাছাকাছি। এটি আরও গতিশীল প্রবাহ ব্যবহার করে, এজন্য বিটি-তে "চলমান" রাষ্ট্র একটি অত্যন্ত বিপজ্জনক রাষ্ট্র, যা খুব কমই ব্যবহার করা উচিত। আমাদের যে কোনও সময় রুটে ফিরে আসার সম্ভাবনাটি মনে রেখে সর্বদা বিটিগুলি ডিজাইন করা উচিত।
v.oddou

0

আমি যখন দেরি করেছি, তবে আশা করি এটি সাহায্য করতে পারে। বেশিরভাগ কারণেই আমি নিশ্চিত করতে চাই যে আমি ব্যক্তিগতভাবে নিজেকে কিছু মিস করিনি কারণ আমিও এটি বের করার চেষ্টা করেছি। আমি বেশিরভাগ ক্ষেত্রেই এই ধারণাটি ধার নিয়েছি Unreal, তবে এটিকে Decoratorবেস হিসাবে সম্পত্তি তৈরি না করে Nodeবা এর সাথে দৃ tied়ভাবে বাঁধা না দেওয়া Blackboard, এটি আরও সাধারণ।

এই নামের একটি নতুন নোড টাইপ পরিচয় করিয়ে দিতে হবে Guardযা সংমিশ্রণ মত হল Decorator, এবং Compositeএবং একটি হয়েছে condition() -> Resultএকটি পাশাপাশি স্বাক্ষরupdate() -> Result

Guardফিরে আসার সময় কীভাবে বাতিল হওয়া উচিত তা নির্দেশ করার জন্য এটিতে তিনটি পদ্ধতি রয়েছে Successবা Failedপ্রকৃতপক্ষে বাতিল হওয়া কলারের উপর নির্ভর করে। সুতরাং একটি Selectorকলিং জন্য Guard:

  1. বাতিল করুন .self -> কেবল Guard(এবং এটির চলমান শিশু) বাতিল করুন যদি এটি চলছে এবং শর্তটি ছিলFailed
  2. বাতিল .lower-> শুধু কম অগ্রাধিকার নোড বাতিল যদি তারা দৌড়াচ্ছে এবং শর্ত ছিল SuccessবাRunning
  3. বাতিল করুন .both -> উভয় .selfএবং .lowerশর্ত এবং চলমান নোডের উপর নির্ভর করে। আপনি স্ব বাতিল করতে তার চলমান যদি এবং চান শর্ত হবে falseঅথবা যদি তারা এর উপর ভিত্তি করে কম অগ্রাধিকার বিবেচিত হন চলমান নোডের বাতিল Composite(নিয়ম Selectorআমাদের ক্ষেত্রে) যদি অবস্থা Success। অন্য কথায়, এটি মূলত উভয় ধারণা একত্রিত।

এটি পছন্দ Decoratorএবং অপছন্দ Compositeশুধুমাত্র একটি একক শিশু লাগে।

যদিও Guardশুধুমাত্র অনেক হিসাবে একটি একক সন্তান, আপনি নীড় করতে পারেন নিতে Sequences, Selectorsবা অন্যান্য ধরনের Nodesআপনি চান হিসাবে সহ অন্যান্য Guardsবা Decorators

Selector1 Guard.both[Sequence[EnemyNear?]] Sequence1 MoveToEnemy Attack Selector2 Sequence2 StandingOnGrass? Idle HumATune

উপরের দৃশ্যে, যখনই Selector1আপডেট হয়, এটি সর্বদা তার বাচ্চাদের সাথে সম্পর্কিত গার্ডদের শর্ত পরীক্ষা করে run উপরের ক্ষেত্রে, Sequence1সুরক্ষিত এবং কাজগুলি Selector1চালিয়ে যাওয়ার আগে এটি পরীক্ষা করা দরকার running

যখনই Selector2বা চেক চলাকালীন রিটার্নের সাথে সাথে Sequence1চলছে তখনই একটি বাধা / বাতিল ইস্যু করবে এবং তারপরে যথারীতি চালিয়ে যাবে।EnemyNear?successGuards condition()Selector1running node

অন্য কথায়, আমরা কিছুটা শর্তের ভিত্তিতে "নিষ্কলুষ" বা "আক্রমণ" শাখায় প্রতিক্রিয়া জানাতে পারি আচরণ স্থির করার চেয়ে আচরণকে আরও প্রতিক্রিয়াশীল করে তোলে Parallel

এটি আপনাকে একককে রক্ষা করার অনুমতি দেয় যা একই সাথে Nodeচালানোর চেয়ে বেশি অগ্রাধিকার দেয়NodesComposite

Selector1 Guard.both[Sequence[EnemyNear?]] Sequence1 MoveToEnemy Attack Selector2 Guard.both[StandingOnGrass?] Idle HumATune

তাহলে HumATuneএকটি দীর্ঘ চলমান Node, Selector2সবসময় চেক করবে যে এক প্রথম যদি এটা জন্য ছিল না Guard। সুতরাং যদি এনপিসি একটি ঘাসের প্যাঁচে টেলিযোগাযোগ হয়, পরের বার Selector2চালিত হয়, এটি চেক করবে Guardএবং HumATuneচালানোর জন্য বাতিল করবেIdle

যদি এটি ঘাসের প্যাচটির বাইরে টেলিফোর্ড হয়ে যায় তবে এটি চলমান নোড ( Idle) বাতিল করে এবং এতে চলে যাবেHumATune

আপনি যেমন এখানে দেখছেন, সিদ্ধান্ত গ্রহণকারী নিজেই Guardনয় বরং আহ্বানের উপর নির্ভর Guardকরে। কাকে বিবেচনা করা হবে তার বিধি lower priorityকলারের কাছে রয়ে গেছে। উভয় উদাহরণে, এটি Selectorকে হিসাবে সংবিধান সংজ্ঞা দেয় lower priority

আপনার যদি Compositeফোন করা থাকে Random Selector, তবে আপনি সেই নির্দিষ্টটির প্রয়োগের মধ্যে বিধিগুলি সংজ্ঞায়িত করতে পারেন Composite

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.