• 01-07-2021, 20:38:45
    #1
    Merhaba 2 tane player var 1 tanede düşman var o düşman en yakın playere doğru gidecek bunu nasıl yapabilirim alttaki kodda en yakın playeri seçiyor ancak ona doğru gitmiyor onu nasıl yapabilirim

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class zombie : MonoBehaviour
    {
        private Animator anim;
        public Transform target;
        public int health = 1;
        private Player p;
        public int zombipuanı = 10;
        bool oyundevam = true;
        public int zombiparası = 10;
      BoxCollider pc2d;
        public GameObject[] otherEnemies;
        public GameObject Gun;
        public float Range;
        public Transform Target;
        bool Detected = false;
        Vector3 Direction;
        public float FireRate;
        float nextTimeToFire = 0;
    
    
    
        private void OnDrawGizmosSelected()
        {
            Gizmos.DrawWireSphere(transform.position, Range);
        }
        void Start()
        {
            pc2d = GetComponent<BoxCollider>();
    
            anim = GetComponent<Animator>();
            otherEnemies = GameObject.FindGameObjectsWithTag("Player");
            Target = PlayereEnYakinEnemy().GetComponent<Transform>();
            Vector3 targetPos = Target.position;
            Direction = PlayereEnYakinEnemy().transform.position - (Vector3)transform.position;
            RaycastHit2D rayInfo = Physics2D.Raycast(transform.position, Direction, Range);
        }
    
        // Update is called once per frame
        void Update()
        {
    
            otherEnemies = GameObject.FindGameObjectsWithTag("Player");
            Target = PlayereEnYakinEnemy().GetComponent<Transform>();
            Vector3 targetPos = Target.position;
            Direction = PlayereEnYakinEnemy().transform.position - (Vector3)transform.position;
            RaycastHit2D rayInfo = Physics2D.Raycast(transform.position, Direction, Range);
    
            if (rayInfo)
            {
                if (rayInfo.collider.gameObject.tag == "Player")
                {
                    if (Detected == false)
                    {
                        Detected = true;
                    }
    
                }
                else
                {
                    if (Detected == true)
                    {
                        Detected = false;
                    }
                }
    
                
    
            }
            if (Detected)
            {
                Gun.transform.up = Direction;
                if (Time.time > nextTimeToFire)
                {
                    nextTimeToFire = Time.time + 1 / FireRate;
                    
                }
            }
        }
        // Start is called before the first frame update
    
    
        // Update is called once per frame
    
        private void OnTriggerEnter(Collider other)  / / burası can yeri
        {
            if (other.gameObject.tag.Equals("mermi"))
            {
                health -= 1; // silme
                if (health <= 0)
                {
    
    
    
                    Destroy(this.gameObject, 1.2f);
    
    
                }
            }
        }
        public GameObject PlayereEnYakinEnemy()   // burası en yakın playeri seçiyor burdan
        {
    
            float mesafe = Mathf.Infinity;
            GameObject enyakinenemy = null;  
            foreach (GameObject enemy in otherEnemies)
              
            {
                Vector3 aralarindakiMesafe = Gun.gameObject.transform.position - enemy.transform.position;
                float enyakinenemymesafesi = aralarindakiMesafe.sqrMagnitude;
                if (enyakinenemymesafesi < mesafe)
                {
                
                    mesafe = enyakinenemymesafesi;
                    enyakinenemy = enemy;
                }
    
            }
          
            return enyakinenemy;
        }
    
    }
    Burasıda haraket kodu yeri

      public void hareker()   // haraket kodu
        {
            if (oyundevam)
            {
                if (Vector3.Distance(transform.position, target.position) > 2f)
                {
                    transform.position = Vector3.MoveTowards(transform.position, target.position, 3 * Time.deltaTime);
                    anim.SetTrigger("yürümek");
                }
                else
                {
                    anim.SetTrigger("saldırı");
                }
                oyundevam = true;
            }
        }
  • 02-07-2021, 16:37:49
    #2
    Hocam inceledim biraz sanırım hedeflemenizde sorun var. Siz anladığım kadarıyla PlayereEnYakinEnemy() metoduyla en yakın olan, gidilecek objeyi return ile döndürmüşsünüz. Fakat hareket kodlarının içinde Vector3.MoveTowards ın parametrelerinde "target.position" şeklinde tanımsız bir noktayı hedef göstermişsiniz. Sizin o metod ile return ettiğiniz objenin transforumunu almanız ve oraya MoveTowards ile göndermeniz gerek. Diğer noktalarda gözüme bir şey çarpmadı istersen uzak masaüstüyle bağlanıp bir inceleyim belki dikkatimi başka bişey çeker
  • 02-07-2021, 21:42:48
    #3
    VERTEX35 adlı üyeden alıntı: mesajı görüntüle
    Hocam inceledim biraz sanırım hedeflemenizde sorun var. Siz anladığım kadarıyla PlayereEnYakinEnemy() metoduyla en yakın olan, gidilecek objeyi return ile döndürmüşsünüz. Fakat hareket kodlarının içinde Vector3.MoveTowards ın parametrelerinde "target.position" şeklinde tanımsız bir noktayı hedef göstermişsiniz. Sizin o metod ile return ettiğiniz objenin transforumunu almanız ve oraya MoveTowards ile göndermeniz gerek. Diğer noktalarda gözüme bir şey çarpmadı istersen uzak masaüstüyle bağlanıp bir inceleyim belki dikkatimi başka bişey çeker
    ayn o haraket kodunu sildim onun yerine navmeshle yaptım düzeldi sorun