کانال بازی سازی تلگرام
چند اسکریپت هوش دشمن (Enemy AI) در یونیتی Enemy AI + Atack + Helth :: آموزش ساخت بازی اندروید+پکیج های تخصصی

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

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

پیوندهای روزانه
پیوندها
gameover.blog.ir

هوش دشمن (Enemy AI)



کد PHP:

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;
    
        }
    }
        
} 
اگه در مورد slerp و distance و ... می خواید بدونید:
slerp میاد حرکت یا چرخش رو به صورت نرم انجام میده. اینجا یادش دادم:
http://promakers.ir/showthread.php?tid=10144&pid=109701#pid109701
Vector3.Distance هم فاصله بین دو ابجکت در فضای سه بعدی رو بدست می آره.
myTransform رو اشاره دادیم به transform (یعنی ابجکت جاری یعنی همون player)
target هم یه متغیر public هست که اون بالا تعریف شده و گیم ابجکت دشمن رو توی inspector میتونیم بکشیم بندازیم روش تا خودش شناسایی کنه. نیازی به کد اضاف هم نداری. اسکریپت بالا خیلی قشنگ کار شما رو راه می اندازه. موفق باشید.

حمله:(Attack) :

کد PHP:
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);
            }
        }
    }
}

Helth سلامتی یا جون:
کد PHP:
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);
	}
}
زبان برنامه نویسی کدهای فوق، سیشارپ هست.
دوستانی که js کار می کنن به بهانه ی سخت بودن csharp ولش نکنن.
به کدها که نگاه کنید با کمی فکر می تونید تبدیل کنید به هم. چون اسم ابجکت ها و ساختار دستورات تقریبا ثل هم هست.
و اگه توی تبدیل مشکل دارید ساختار و الگوی توابع مورد نظر رو به زبان دلخواه در google سرچ کنید و سپس تغییرات رو ایجاد کنید. به همین راحتی happy
منبع :
http://www.mpgh.net/forum/showthread.php?t=427244

کد هوش مصنوعی سایت اصلی یونیتی . هوش دشمن بر اساس موقعیت player:

این رو از سایت اصلی یونیتی به این آدرس گرفتم : http://unity3d.com/learn/tutorials/proje...h/enemy-ai


همون کدبه زبان سیشارپ :
کد PHP:
//کد سیشارپ
using UnityEngine;
using System.Collections;

public class EnemyAI : MonoBehaviour
{
    public float patrolSpeed = 2f;                          // The nav mesh agent's speed when patrolling.
    public float chaseSpeed = 5f;                           // The nav mesh agent's speed when chasing.
    public float chaseWaitTime = 5f;                        // The amount of time to wait when the last sighting is reached.
    public float patrolWaitTime = 1f;                       // The amount of time to wait when the patrol way point is reached.
    public Transform[] patrolWayPoints;                     // An array of transforms for the patrol route.
    
    
    private EnemySight enemySight;                          // Reference to the EnemySight script.
    private NavMeshAgent nav;                               // Reference to the nav mesh agent.
    private Transform player;                               // Reference to the player's transform.
    private PlayerHealth playerHealth;                      // Reference to the PlayerHealth script.
    private LastPlayerSighting lastPlayerSighting;          // Reference to the last global sighting of the player.
    private float chaseTimer;                               // A timer for the chaseWaitTime.
    private float patrolTimer;                              // A timer for the patrolWaitTime.
    private int wayPointIndex;                              // A counter for the way point array.
    
    
    void Awake ()
    {
        // Setting up the references.
        enemySight = GetComponent<EnemySight>();
        nav = GetComponent<NavMeshAgent>();
        player = GameObject.FindGameObjectWithTag(Tags.player).transform;
        playerHealth = player.GetComponent<PlayerHealth>();
        lastPlayerSighting = GameObject.FindGameObjectWithTag(Tags.gameController).GetComponent<LastPlayerSighting>();
    }
    
    
    void Update ()
    {
        // If the player is in sight and is alive...
        if(enemySight.playerInSight && playerHealth.health > 0f)
            // ... shoot.
            Shooting();
        
        // If the player has been sighted and isn't dead...
        else if(enemySight.personalLastSighting != lastPlayerSighting.resetPosition && playerHealth.health > 0f)
            // ... chase.
            Chasing();
        
        // Otherwise...
        else
            // ... patrol.
            Patrolling();
    }
    
    
    void Shooting ()
    {
        // Stop the enemy where it is.
        nav.Stop();
    }
    
    
    void Chasing ()
    {
        // Create a vector from the enemy to the last sighting of the player.
        Vector3 sightingDeltaPos = enemySight.personalLastSighting - transform.position;
        
        // If the the last personal sighting of the player is not close...
        if(sightingDeltaPos.sqrMagnitude > 4f)
            // ... set the destination for the NavMeshAgent to the last personal sighting of the player.
            nav.destination = enemySight.personalLastSighting;
        
        // Set the appropriate speed for the NavMeshAgent.
        nav.speed = chaseSpeed;
        
        // If near the last personal sighting...
        if(nav.remainingDistance < nav.stoppingDistance)
        {
            // ... increment the timer.
            chaseTimer += Time.deltaTime;
            
            // If the timer exceeds the wait time...
            if(chaseTimer >= chaseWaitTime)
            {
                // ... reset last global sighting, the last personal sighting and the timer.
                lastPlayerSighting.position = lastPlayerSighting.resetPosition;
                enemySight.personalLastSighting = lastPlayerSighting.resetPosition;
                chaseTimer = 0f;
            }
        }
        else
            // If not near the last sighting personal sighting of the player, reset the timer.
            chaseTimer = 0f;
    }

    
    void Patrolling ()
    {
        // Set an appropriate speed for the NavMeshAgent.
        nav.speed = patrolSpeed;
        
        // If near the next waypoint or there is no destination...
        if(nav.destination == lastPlayerSighting.resetPosition || nav.remainingDistance < nav.stoppingDistance)
        {
            // ... increment the timer.
            patrolTimer += Time.deltaTime;
            
            // If the timer exceeds the wait time...
            if(patrolTimer >= patrolWaitTime)
            {
                // ... increment the wayPointIndex.
                if(wayPointIndex == patrolWayPoints.Length - 1)
                    wayPointIndex = 0;
                else
                    wayPointIndex++;
                
                // Reset the timer.
                patrolTimer = 0;
            }
        }
        else
            // If not near a destination, reset the timer.
            patrolTimer = 0;
        
        // Set the destination to the patrolWayPoint.
        nav.destination = patrolWayPoints[wayPointIndex].position;
    }
}
 

در کدهای فوق تابعی به نام Slerp می بینیم که عضو کلاس Quaternion هست و به صورت زیر آوردیمش:
کد :

Quaternion.Slerp(From,To,Time); 
برای اینکه Slerp رو درک کنید. فقط کافیه تابع Lerp رو درک کنید. من اینجا توضیحش دادم:
http://promakers.ir/showthread.php?tid=10144&pid=109701#pid109701
Slerp هم همون پارامترها رو می گیره. بعدا اگه احساس کردید بینشون فرقی هست تذکر خودتون رو پ.خ کنید


target = ابجکتی که باید دشمن دنبالش کنه . (player رو با ماوس می گیریم میندازیم روش تا دشمن player رو دنبال کنه)
بقیه پارامترها مربوط به وری تابع slerp هستن که سرعت چرخش و سرعت حرکت رو میدیم بهش و در دلتا تایم ضرب کردیم که اهسته حرکت انجام بشه به سمت هدف ، نه تند.
کاربرد Slerlp رو هم واسه اینکه یاد بگیرید اینجا رو بخونید :

http://promakers.ir/showthread.php?tid=10144&pid=109701#pid109701

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

نظرات (۱)

خسته نباشی 
خیلی خوب
پاسخ:
قربانت

ارسال نظر

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