کانال بازی سازی تلگرام
کد هوش مصنوعی دشمن ( خون و حمله ) بسیار ساده در یونیتی به زبان سی شارپ :: آموزش ساخت بازی اندروید+پکیج های تخصصی

آموزش ساخت بازی اندروید+پکیج های تخصصی

هرگز دل من ز علم محروم نشد
کم ماند ز اسرار که معلوم نشد
هفتاد و دو سال فکر کردم شب و روز
معلومم شد که هیچ معلوم نشد
---
تمام اعمالی که انجام می دهیم، حتی اگر ذره ای و مثقالی باشد، به خودمان باز می گردد و بازتابش آنها را در زندگی خواهیم دید. زلزال ۷
او کسی است که (روح) شما را در شب (به هنگام خواب) میگیرد; و از آنچه در روز کرده‏اید، با خبر است; سپس در روز شما را (از خواب) برمیانگیزد; و (این وضع همچنان ادامه مییابد) تا سرآمد معینی فرا رسد; سپس بازگشت شما به سوی اوست; و سپس شما را از آنچه عمل میکردید، با خبر میسازد. انعام ۶۰
دلها به یاد خدا آرام میگیرد. رعد آیه ۲۷
بدانید زندگی دنیا تنها بازی و سرگرمی، و تجمل پرستی و تفاخر در میان شما و افزون طلبی در اموال و فرزندان است . حدید آیه ۲۰
آن خدایی که آدمی را از خون بسته (که تحول نطفه است) بیافرید.
بخوان و (بدان که) پروردگار تو کریم‌ترین کریمان عالم است.
آن خدایی که بشر را علم نوشتن به قلم آموخت.
به آدمی آنچه را که نمی‌دانست تعلیم داد.
راستی که انسان سرکش و مغرور می‌شود.
چون که خود را در غنا و دارایی ببیند. علق ۲- ۷
این زندگانی چند روزه دنیا افسوس و بازیچه‌ای بیش نیست، عنکبوت ۶۴
در روی زمین به تکبر راه مرو که نمی توانی زمین را بشکافی و هرگز قامتت به بلندای کوهها نمی رسد. اسراء ۳۷
در آنچه خداوند بر تو بخشیده است، سرای آخرت را بجوی و سهم خود را از دنیا فراموش مکن و همانگونه که خدا به تو نیکی کرده است نیکی کن و هرگز فساد در زمین منما که خدا مفسدان را دوست ندارد. قصص ۷۷
و هرگاه نعمت و رحمتی به انسان بچشانیم و سپس آن را از او برگیریم او مأیوس و نومید میشود و به کفران و ناسپاسی بر میخیزد. هود ۹
بندگان مرا آگاه ساز که من بسیار آمرزنده و مهربانم. حجر ۴۹
از رحمت خدا نا امید مباشید که جز کافر هیچ کس از رحمت خدا نا امید نیست. یوسف ۸۷
پس به یاد من باشید تا به یاد شما باشم. بقره ۱۵۲
زندگانی دنیا چیزی جز متاع فریبنده نیست . آل عمران ۱۸۵
از آنچه به شما روزی داده ایم پیش از آنکه روزی فرا رسد که نه معامله ای وجود دارد و نه دوستی و شفاعت ، انفاق کنید. بقره ٢۴۵
بسا چیزی را ناخوش داشته باشید که آن به سود شماست و بسا چیزی را دوست داشته باشید که به زیان شماست، و خدا میداند و شما نمیدانید. بقره ۲۱۶
ما آیات (خود) را برای شما بیان کردیم شاید اندیشه کنید...حدید ۱۷

پیوندهای روزانه
پیوندها
منبع:gameover.blog.ir


نویسنده :alimka
منبع:http://www.crydev.ir/thread79.html

برای اینکه بتونیم از این کد ها استفاده کنیم ابتدا باید دوتا شی ایجاد کنیم . مثلا دو مکعب ایجاد می کنیم به نام Enemy و Player.


حالا یک فایل سی شارپ با نام EnemyAI ایجاد می کنیم ( توجه کنید که حتما اسمش این باشه ). کد زیر رو توش کپی می کنیم.
using UnityEngine;
using System.Collections; public class EnemyAI : MonoBehaviour { public Transform target; public int moveSpeed; public int rotationSpeed; public int maxdistance; private Transform myTransform; void Awake(){ myTransform = transform; } void Start () { GameObject go = GameObject.FindGameObjectWithTag("Player"); target = go.transform; maxdistance = 2; } void Update () { Debug.DrawLine(target.position, myTransform.position, Color.red); myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime); if(Vector3.Distance(target.position, myTransform.position) > maxdistance){ //Move towards target myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime; } } }

فایل رو سیو می کنیم و به شی Enemy مرتبطش می کنیم و شی Player رو به عنوان هدف بهش معرفی کرده و مقادیر سرعت حرکت سرعت چرخش و میزان فاصلشو با شی مورد نظر مشخص می کنیم.

خب حالا یک فایل C# دیگه با نام PlayerHealth ساخته و کد زیر رو درش کپی می کنیم.
using UnityEngine;
using System.Collections; 
public class PlayerHealth : MonoBehaviour {
    public int maxHealth = 100;
    public int curHealth = 100;
     
    public float healthBarLength; 
 
    void Start () {
    healthBarLength = Screen.width / 2;
    }
 
    void Update () {
    AddjustCurrentHealth(0);
         
    }
     
     
    void OnGUI(){
    GUI.Box(new Rect(10, 10, healthBarLength, 20), curHealth + "/" + maxHealth);    
    }
     
    
    public void AddjustCurrentHealth(int adj) {
      curHealth += adj; 
         
        if(curHealth < 0)
            curHealth = 0;
         
        if(curHealth > maxHealth)
            curHealth = maxHealth;
         
        if(maxHealth < 1)
            maxHealth = 1;
         
        healthBarLength = (Screen.width / 2) * (curHealth / (float)maxHealth);
    }
}
حال فایل رو سیو می کنیم و به شی Player متصلش می کنیم و میزان سقف خون ، میزان خون حال حاضر و طول میزان خونی که در صفحه نمایش نمایش داده میشه که البته نیازی به تعیین این نیست و خودش اتوماتیک تعیین میشه.

خب حالا نوبت به حمله دشمن میرسه . یک فایل با نام EnemyAttack می سازیم و کد زیر رو درش کپی می کنیم.
using UnityEngine;
using System.Collections;
 public class EnemyAttack : MonoBehaviour {
    public GameObject target;
    public float attackTime;
    public float coolDown;  
    void Start () {
        attackTime = 0;
        coolDown = 2.0f;
     
    }
    void Update () {
        if(attackTime > 0)
            attackTime -= Time.deltaTime;
         
        if(attackTime < 0)
            attackTime = 0;
         
         
    if(attackTime == 0) {
        Attack();
        attackTime = coolDown;
        }
     
    }
     
    private void Attack() {
        float distance = Vector3.Distance(target.transform.position, transform.position);
         
         
        Vector3 dir = (target.transform.position - transform.position).normalized;
        float direction = Vector3.Dot(dir, transform.forward);
         
                 
        if(distance < 2.5f) {
            if(direction > 0) {
         PlayerHealth eh = (PlayerHealth)target.GetComponent("PlayerHealth");
        eh.AddjustCurrentHealth(-10);
            }
        }
    }
}
بعد از اینکار فایل رو ذخیره کرده و به شی دشمن نسبت میدیم و شی هدف که همون Player هست رو بهش معرفی کرده و مقدار زمان حمله و زمان آماده سازی رو براش تعیین می کنیم.

حالا بازی رو اجرا می کنیم و میبینیم که به دنبال پلیر میفته تا نگیردشم ول کن نیستش.

در یک آموزش دیگه خیلی جالب ترش می کنیم و کاری می کنیم که دشمنمون فکر کنه . بعد هی نیفته توی یه مسیر و بزور بگرده . هر وقت که پلیر رو دید عکس العمل نشون بده.

برای پیاده سازی انیمیشن در این کد می تونید از توضیحات زیر استفاده کنید.
کد EnemyAI را با کد زیر عوض کنید و وقتی مقایسه کنید می فهمید که چطور میشه اجراش کرد.
using UnityEngine;
using System.Collections; 
  
public class EnemyAI : MonoBehaviour {
    public Transform target;
    public int moveSpeed;
    public int rotationSpeed;
    public int maxdistance;      
    private Transform myTransform;      
    void Awake(){
        myTransform = transform;
    }
    void Start () {
        GameObject go = GameObject.FindGameObjectWithTag("Player");     
        target = go.transform;      
        maxdistance = 2;
    }
        
    void Update () {
        Debug.DrawLine(target.position, myTransform.position, Color.red); 
        myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed * Time.deltaTime);
          
        if(Vector3.Distance(target.position, myTransform.position) > maxdistance){
        //Move towards target
          animation.CrossFade("Walk", 0.2F);
          myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
      
        }
    }
}
و در آخر هم توضیحات مر بوط به کد نویسی این سه فایل.

اول کد EnemyAI .
خط اول دو فضای نام مربوط به یونیتی می باشد که باید فراخوانی شود تا بتوان کد نویسی کرد. یک مثال بارز در این باره ، فرض کنید شما می خواهید با پسردایی تان به کوه بروید اما تا دایی شما همراهتان نیاید و اجازه ندهد شما نمی توانید بروید هر چی هم اصرار کنید او نمی آید. در اینجا هم هرچه آن توابع و موجودیت ها را صدا کنید پاسخی داده نمی شود مگر آنکه فضاهای نام را فراخوانی کرده باشید.
خط 4 بصورت خودکار وقتی شما یک فایل سی شارپ ایجاد می کنید این کد در فایل قرار می گیرد و منظور آن این است که یک کلاس عمومی با نام EnemyAI از نوع MonoBehaviour . حال شاید بگویید مونو چیست ؟ مونو در برگیرنده بعضی از توابع و رخداد ها می باشد و باعث دسترسی خیلی بیشتر به اجزا می شود.
خط 5 یک متغیر عمومی از نوع Transform با نام Target ایجاد می کند. این شی موقعیت همان هدف موردنظر را بدست می آورد.
خط 6 یک متغیر عمومی از نوع صحیح با نام MoveSpeed که وظیفه اش تعیین سرعت دشمن می باشد ایجاد می کند.
خط 7 یک متغیر عمومی از نوع صحیح با نام RoationSpeed که وظیفه اش تعیین سرعت چرخش دشمن می باشد ایجاد می کند. که البته شما می توانید از این مورد استفاده نکنید. در صورت حذف کردن این متغیر باید کد را ویرایش نمایید.
خط 8 یک متغیر عمومی از نوع صحیح با نام Maxdistance که وظیفه اش تعیین میزان فاصله دشمن با کاراکتر می باشد را ایجاد می کند.
خط 10 یک متغیر خصوصی از نوع Transform با نام myTransform که موقعیت فعلی شی دشمن را تعیین می کند.
خط بعد یک تابع بدون مقدار بازگشتی یا تهی با نام Awake معرفی می کند. یکی از زیر مجموعه های MonoBehaviour می باشد. موقع فراخوانی می شود که قرار است رخدادی برای اولین بار صورت بگیرد مثال زمانی که کد تازه در حال لود شدن هست اما هنوز شروع نشده است.
در خط بعد موقعیت حال حاضر رو به متغیر myTransform انتقال می دهد و برای استفاده های بعد آماده می کند ، در اصل یک نمونه از مقدار transform شی دشمن می سازد.
در خط 20 یک تابع تهی دیگر با نام Start را فراخوانی می کند توجه کنید که این توابع بصورت پیش فرض وجود دارند و فقط شما از آنها باید بدرستی استفاده نمایید. تعریف اصلی این نوع توابع این است که آنها رخداد هستند مثال هنگامی که بازی شروع می شود یا هنگامی که به یک شی نزدیک می شود. تابع Start برای زمانی که بازی شروع می شود کاربرد دارد.
در خط 21 یک شی با نام go می سازد و به او دستور می دهد که موقعیت شی با نام Player را پیدا کند و در خود قرار دهد. در اینجا یک مثاله مهم وجود دارد که شما باید قبل از هر کاری یک تگ با نام Player تعریف کنید. تگ چیست ؟ تگ برای مشخص کردن گروه یا دسته ای از اشیاست که از طریق کد براحتی می توان به اشیا دسترسی پیدا کرد.
در خط 23 موقعیت فعلی شی Player را به شی مورد نظر نسبت می دهد.


در خط 26 یک تابع یا رخداد دیگر با نام Update فراخوانی شده است. این رخداد هنگامی که بازی در جریان است هر ثانیه یک بار مقادیر و دستورات درون خود را چک می کند.
در خط 27 یک خط از شی هدف تا شی دشمن با رنگ قرمز ترسیم می شود.
در خط 30 زاویه چرخش شی دشمن اینگونه تعیین می شود . از تابع Quaternion برای چرخاندن هر شی ای که فکر کنید استفاده می شود. در اینجا از خاصیت Quaternion.Slerp استفاده شده است که برای مشخص کردن زاویه چرخش از شی دشمن تا شی هدف و با سرعتی که با زمان ضرب شده و محاسبه می شود اما در اینجا یکم مقدار متفاوت می باشد ما در اینجا از یک خاصیت دیگر Quaternion.LookRotation استفاده کرده ایم که زاویه دید شی دشمن را مشخص می کند. Quaternion.LookRotation به این صورت محاصبه می شود که موقعیت شی هدف منهای موقعیت شی دشمن. در آخر سرعت چرخش در واحد زمان ضرب می شود. یک مقدار درکش سخت است اما با یکم تمرین متوجه خواهید شد.
خط 32 در خود یک شرط را داراست این شرط شامل این می شود که فاصله شی هدف و شی دشمن تا زمانیکه بزرگتر از اندازه ی فاصله ای که ما تعیین کرده ایم باشد دستوری که در خط 34 قرار دارد انجام شود.
خط 34 موقعیت شی دشمن را به این صورت تغییر می دهد که موقعیت شی در سمت جلو حرکت به سمت شی هدف در موقعیت x و y ضربدر سرعت حرکت که ما تعیین می کنیم ضربدر زمان حال حاضر که به ثانیه محاسبه می شود در اصل این مقدار ثانیه را محاسبه می کند.


خب توضیحات کد EnemyAI به پایان رسید حال نوبت به کد PlayerHealth می رسد.
قسمت های که در کد قبل توضیح داده شد دیگر توضیح داده نمی شود و مابقی کدها توضیح داده می شود.
در خط 5 یک متغیر عمومی با نام maxHealth از نوع اعداد صحیح با مقدار 100 تعریف شده که بیشترین میزان ممکنه خون هدف را نمایش می دهد.
در خط 6 یک متغیر عمومی با نام curHealth از نوع اعداد صحیح با مقدار 100 تعریف شده که میزان خون حال حاضر هدف را نمایش می دهد.
در خط 8 یک متغیر عمومی با نام healthBarLength از نوع اعداد اعشار تعریف شده که طول میزان خون هدف در نمایشگر را نمایش می دهد. منظور همان رابط گرافیکی که به کاربر قرار است نشان داده شود می باشد.
در خط 12 وقتی بازی شروع می شود نصف عرض صفحه نمایش به متغیر healthBarLength اختصاص می یابد.
در خط 17 تابع AddjustCurrentHealth که در چند خط بعد تعریف شده فراخوانی می شود و مقداری که برای آن ارسال می شود 0 می باشد. این مقدار از نوع عدد صحیح می باشد.
خط 22 یک رخداد یا تابع می باشد که فعالیت های مربوط به رابط کاربری یا نمایش بعضی از مقادیری که باید کاربر از آن مطلع باشد را در بر می گیرد. نام آن OnGUI می باشد.
خط 23 - به سیستم دستور داده می شود که یک جعبه با ایعاد 10*10 و مقایسی از صفحه نمایش که در کجای تصویر به نمایش درآید که ما در اینجا از متغیر healthBarLength برای مقدار عرض و از 20 برای مشخص کردن ارتفاع یا Height صفحه نمایش استفاده کرده ایم در آخر میزان خون باقی مانده از حداکثر خونی که داشته ایم را نمایش می دهیم.






در خط 27 تابع عمومی از نوع تهی با نام AddjustCurrentHealth با مقدار دریافتی int تعریف شده است.
در خط 28 مقدار متغیر curHealth با مقداری که در خط 17 برای تابع AddjustCurrentHealth جمع می شود. توجه کنید که آن مقدار ارسالی در متغیر adj ذخیره شده است.
در خط 30 این شرط بررسی می شود که آیا مقدار متغیر curHealth کوچک تر از 0 است یا خیر اگر کوچک تر بود کد خط 31 اجرا شود. این شرط بدان معناست که میزان خون حال حاظر منفی نباشد که اگر بود آنرا برابر 0 قرار دهد.
خط 31 مقدار curHealth را برابر صفر می کند.
در خط 33 شرط اینکه آبا مقدار متغیر curHealth بزرگتر از maxHealth است یا خیر بررسی می شود که اگر بزرگ تر بود کد خط 34 اجرا می شود. این به این معنی است که اگر میزان خون حال حاضر کاراکتر بیشتر از میزان حد تعیین شده باشد مثلا اگر از 100 بزرگتر بود برابر با 100 شود.
خط 34 مقدار متغیر curHealth را برابر مقدار متغیر maxHealth قرار می دهد.
خط 36 شرطی را بررسی می کند که آیا مقدار متغیر maxHealth از 1 کوچکتر است یا خیر. اگر این چنین بود خط 37 اجرا می شود.
خط 37 مقدار متغیر maxHealth را برابر یک قرار می دهد.
خط 39 - اگر در خاطرتان باشد کمی قبل تر گفتیم که متغیر healthBarLength میران خون هدف را در خروجی یا صفحه نمایش به کاربر نشان می دهد. در این خط میزان این متغیر برابراست با نصف عرض صفحه نمایش ضربدر میزان خون حال حاضر تقسیم بر بیشترین میزان خون.
توضیحات مربوط به کد PlayerHealth به پایان رسید و نوبت به کد EnemyAttack می رسد.
در خط 5 یک متغیر عمومی از نوع GameObject تعریف شده که شی هدف در ان تعریف می گردد.
خط6 - یک متغیر عمومی از نوع اعشاری تعریف شده و میزان زمان حمله را در خود نگهداری می کند.
خط7 - یک متغیر عمومی از نوع اعشاری تعریف شده که میزان زمان حمله بعد را در بر می گیرد.
خط12 - زمان حمله را صفر تعیین می کند.
خط13 - زمان زمان حمله بعد را 2 قرار می دهد.
خط19 - شرط ای این قرار است که اگر زمان حمله بزرگ تر از صفر بود کد خط 20 انجام شود.
خط20 - این کد یک واحد زمان از میزان زمان حمله کم می کند.
خط22 - اگر زمان حمله کمتر از 0 بود یعنی منفی باشد کد خط 23 اجرا می شود.
خط23 - این کد زمان حمله را 0 می کند.
خط26 - شرط چک می کند آیا زمان حمله برابر است با صفر یا خیر که اگر شرط برقرار باشد یعنی مصاوی صفر باشد کدهای خط 27 و 28 انجام می شوند.
خط27 - تابع Attack که دو سطر بعد به آن می پردازیم فراخوانی می شود.
خط28 - زمان حمله را برابر میزان زمان حمله بعد قرار می دهد.
خط33 - یک تابع از نوع خصوصی تهی با نام Attack تعریف می کند.
خط34 - یک متغیر اعشاری با نام distance تعریف می کند و مقدار آن برابر می شود با میزان فاصله شی هدف و شی دشمن. توجه کنید که این یک نتغیر مجلی بوده و سراسری نیست. متغیر محلی متغیری است که فقط در اینتابع قابل استفاده است و حتی برنامه اصلی هم به آن دسترسی نحواهد داشت.
خط37 - یک متغیر از نوع Vector3 ساخته و جهت حرکت را با منها کردن مکان فعلی شی هدف و مکان فعلی شی دشمن به دست آورده و آنرا نرمال سازی می کند. در صورتی که نرمال سازی انجام نشود عدد صفر باز می گردد.
خط38 - یک متغیر اعشاری با نام direction تعریف می کند و مقدار آن برابر است با دو محور برداری که حاصل متغیر dir و transform.forward که بیانگر جهت حرکت می باشد است و این جاصل را خصوصیت Dot برای ما بدست می آورد. این حاصل جهت حرکت را مشخص می کند.
خط41 - شرط این را بررسی می کند که اگر فاصله تا شی هدف کمتر از 2.5 بود دستور خط 42 اجرا شود.
خط42 - در این خط شرکت به این گونه می باشد که اگر جهت میزانش بزرگتر از صفر بود کد خط های 43 و 44 اجرا شود.
خط43 - در اینجا یک نکته مهم وجود دارد این کد به کد PlayerHealth که کمی قبل تر بررسی کردیم متصل شده و میزان خون شی هدف را برای ما در متغیر eh ذخیره می کند.
خط44 - در آخر میزان خون شی هدف 10 واحد کم شده و در همان کد PlayerHealth تغییرات اعمال می شود. تابع AddjustCurrentHealth از کد PlayerHealth فراخوانی می شود و مقدار -10 در کد اعمال می شود. فرض کنید مقدار دریافت شده اولیه 100 باشد وقتی این کد رخ می دهد 10 واحد از آن کم شده و مقدار 90 به آن باز گردانده می شود.
خب دوستان اینم از توضیحات مربوط به این کدها. امیدوارم به کارتون بیادو استفاده کنید. در ضمن اگر جایی رو متوجه نشدید جتما بگید تا براتون بیشتر توضیح بدم.اگه بد توضیح دادم ببخشید دیگه خیلی سریع جمع و جورش کردم.

موافقین ۰ مخالفین ۰ ۹۴/۰۷/۰۵
مدیرکل

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی