«یا اللهُ یا رَبِّ یا حَیُّ یا قَیّوم یا ذَالجَلالِ وَ الاکرام اَسئَلُکَ بِاسمِکَ اَلعَظیم اَلاَعظَم اَن تَرزُقَنی رِزقاً حَلالاً طَیِّباً بِرَحمَتِکَ الواسِعَه یا اَرحَمَ الرّاحِمِین.»
چند اسکریپت هوش دشمن (Enemy AI) در یونیتی Enemy AI + Atack + Helth :: گیم اور _ بازیسازی با unity + مطالب متفرقه

گیم اور _ بازیسازی با unity + مطالب متفرقه

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

آموزش های علمی با اجازه ی خدا تقدیم به هرکس خدا بخواد

به نام خدا
--
گروه قدیم ما promakers.ir یا پرومیکرز بود که بالای هزار اموزش توش ساخته بودم به اسم sajjad3011 ولی حیف ادمین سایتش عوض کرد
حالا سوالی بود کاری بود این شمارمه

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

---
سوالی بود بذارید
نظر خصوصی نذارید
پاسخش سخته
دوست داشتید شماره بذارید تو واتساپ یا ایتا یا .... گروه بزنیم.
09358077198

بایگانی
پیوندها
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="">
تجدید کد امنیتی