এআই এজেন্টরা কীভাবে তাদের পরিবেশ সম্পর্কে তথ্য অ্যাক্সেস করতে পারে?


9

এটি একটি তুচ্ছ প্রশ্নের মতো হতে পারে তবে এটি বুঝতে আমার সমস্যা হচ্ছে। আপনার সাহায্যের খুব প্রশংসা করবে

অবজেক্ট অরিয়েন্টেড ডিজাইন ব্যবহার করে গেম ডেভেলপমেন্টে, আমি বুঝতে চাই যে এআই-এজেন্টরা কীভাবে তাদের ক্রিয়া সম্পাদন করতে গেম জগত থেকে প্রয়োজনীয় তথ্য অ্যাক্সেস করে।

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

আমার সমস্যাটি আমি কীভাবে এটি করব তা নিশ্চিত নই। কোনও এআই এজেন্ট কীভাবে গেমের বিশ্ব সম্পর্কে প্রয়োজনীয় তথ্য অ্যাক্সেস করতে পারে?

একটি সম্ভাব্য পন্থা হ'ল এজেন্টরা কেবল গেম জগত থেকে সরাসরি তাদের প্রয়োজনীয় তথ্যের জন্য অনুরোধ করে।

গেম ওয়ার্ল্ড নামে একটি ক্লাস রয়েছে। এটি গুরুত্বপূর্ণ গেম লজিক (গেম লুপ, সংঘর্ষ সনাক্তকরণ, ইত্যাদি) পরিচালনা করে এবং গেমের সমস্ত সত্ত্বার রেফারেন্সও ধারণ করে।

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

উদাহরণস্বরূপ, কোনও এজেন্ট Seekপ্লেয়ারের কাছাকাছি থাকলে প্রোগ্রাম হতে পারে । এটি করতে এজেন্টকে প্লেয়ারের অবস্থান পেতে হয়। সুতরাং এটি শুধু এটি সরাসরি অনুরোধ করতে পারেন: GameWorld.instance().getPlayerPosition()

কোনও এজেন্ট কেবল গেমের সমস্ত সত্ত্বার তালিকা পেতে পারে এবং এটির প্রয়োজনীয়তার জন্য এটি বিশ্লেষণ করতে পারে (কোন সত্তাগুলি কী কী নিকটে বা অন্য কোনও কিছুর কাছাকাছি রয়েছে তা নির্ধারণ করতে): GameWorld.instance().getEntityList()

এটিই সহজতম পদ্ধতি: এজেন্টরা সরাসরি গেম ওয়ার্ল্ড শ্রেণিতে যোগাযোগ করে এবং প্রয়োজনীয় তথ্য পান। তবে এটিই আমি জানি the এর চেয়ে ভাল আর কি আছে?

একজন অভিজ্ঞ গেম ডেভেলপার কীভাবে এটি ডিজাইন করবে? "সমস্ত সত্তার একটি তালিকা পান এবং আপনার যা প্রয়োজন তার জন্য অনুসন্ধান করুন" ভোলাভুক্ত? এআই এজেন্টদের তাদের ক্রিয়া সম্পাদনের জন্য প্রয়োজনীয় তথ্য অ্যাক্সেস করার অনুমতি দেওয়ার জন্য কী কী পদ্ধতি এবং পদ্ধতি রয়েছে?


আপনার যদি কোনও জিডিসিওউল্ট সাবস্ক্রিপশন অ্যাক্সেস থাকে তবে ২০১৩ সালে একটি দুর্দান্ত কথাবার্তা হয়েছিল "এআই ক্রিয়েটিং ফর দ্য লিভিং, ব্রেথিং ওয়ার্ল্ড অফ হিটম্যান অ্যাবসোলশন" যা তাদের এআই জ্ঞানের মডেলটিতে বিস্তারিতভাবে যায়।
ডিএমগ্রিগরি

উত্তর:


5

আপনি যা বর্ণনা করেন তা বিশ্বকে জিজ্ঞাসা করার একটি সর্বোত্তম "টান" মডেল। বেশিরভাগ সময়, এটি বেশ ভালভাবে কাজ করে, বিশেষত বেসিক এআই (যা বেশিরভাগ) সহ গেমগুলির জন্য। যাইহোক, কয়েকটি পয়েন্ট রয়েছে যা আপনার বিবেচনা করা উচিত যা ডাউনসাইড হতে পারে:

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

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

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

  • অবশেষে, আপনি সম্ভবত উত্তরাধিকারের চেয়ে আপনার অনুসন্ধানযোগ্য বস্তুর জন্য ইন্টারফেস বা উপাদানগুলি ব্যবহার করতে চান, যা অন্য কোথাও ভালভাবে নথিবদ্ধ। Entitiesচেকিংয়ের একটি তালিকাতে আইট্রেট instanceOfকরা সম্ভবত বেশ ভঙ্গুর কোডের একটি রেসিপি, আপনি যে মুহুর্তে উভয়ই চান StaticObjectএবং MovingObjectহতে চান Healable। (যদি instanceOfনা আপনার পছন্দের ভাষায় ইন্টারফেসের জন্য কাজ করে))


5

এআই ব্যয়বহুল হওয়ায়, অভিনয় প্রায়শই আর্কিটেকচারের ড্রাইভিং ফ্যাক্টর।

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

(প্রতিটি উদাহরণ একক, গ্লোবাল লজিক আপডেট অনুমান করে))

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

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

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

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

আর্কিটেকচারাল পয়েন্টস

এটি উপরে পরিষ্কার হয়ে গেছে যে আমরা এআইয়ের জন্য কেবল একটি সঠিক ডেটা অ্যাক্সেসের ধরণ ধরে নিতে পারি না; পছন্দটি আপনি কী অর্জন করতে চাইছেন তার উপর নির্ভর করে। GameWorldক্লাসে সরাসরি অ্যাক্সেস করা একেবারে মান: এটি কেবল আপনাকে বিশ্বের তথ্য সরবরাহ করে। মূলত এটি আপনার ডেটা মডেল এবং ডেটা মডেলগুলির জন্য এটি। একা এই জন্য ভাল।

"সমস্ত সত্তার একটি তালিকা পান এবং আপনার যা প্রয়োজন তা সন্ধান করুন"

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


উত্তর করার জন্য ধন্যবাদ. যেহেতু আমি গেম দেবের শিক্ষানবিশ, তাই আমি মনে করি আমি আপাতত সহজ "গেম ওয়ার্ল্ড থেকে একটি তালিকা পেতে পারি" :) একটি প্রশ্ন: আমার প্রশ্নে আমি ক্লাসটিকে GameWorldক্লাস হিসাবে বর্ণনা করেছি যার উল্লেখ রয়েছে সমস্ত গেম সত্তা, এবং এর মধ্যে বেশিরভাগ গুরুত্বপূর্ণ 'ইঞ্জিন' যুক্তি রয়েছে: প্রধান গেম লুপ, সংঘর্ষ সনাক্তকরণ ইত্যাদি It's এটি মূলত গেমটির 'প্রধান শ্রেণি'। আমার প্রশ্ন: গেমগুলিতে কি এই পদ্ধতিটি সাধারণ? 'মেইন ক্লাস' আছে? বা আমি কী এটি ছোট শ্রেণিতে বিভক্ত করব এবং 'সত্তা ডাটাবেস' অবজেক্টগুলি পোল করতে পারে তার একটি ক্লাস থাকা উচিত?
আভিভ কোহন

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

2

মূলত আমার কাছে তথ্য অনুসন্ধানের 2 টি উপায় থাকবে।

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

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

    Transform* targetTransform = nullptr;
    EnemyAIState  AIState = EnemyAIState::Idle;
    void OnTriggerEnter(GameObject* go)
    {
       if(go->hasTag(TAG_PLAYER))
       {
       //Cache important information that will be needed during pursuit
       targetTransform = go->getComponent<Transform>();
       AIState = EnemyAIState::Pursue;
       }
    }
    
    void Update()
    {
       switch(AIState)
       {
          case EnemyAIState::Pursue:
           //Find position to move to
           Vector3 nextNode = PathSystem::Seek(
                              transform->position,targetTransform->position);
           /*Update the position towards the target by whatever speed the unit moves
             Depending on how robust your path system is you might want to raycast
             against obstacles it can't take into account or might clip the path.*/
            transform->Move((nextNode - transform->position).unitVector()*speed*Time::deltaTime());
            break;
        }
     }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.