【问题标题】:Enemy Projectile Script Won't Shoot Closest Object敌人射弹脚本不会射击最近的物体
【发布时间】:2021-10-14 16:27:16
【问题描述】:

我一直在试图弄清楚 Enemy 如何不返回多个 GameObjects 它只返回一个。我不确定它是否是我的 Bullet 脚本,它只允许返回一个对象。我目前正在尝试与 Slither.io 等多个玩家一起开发游戏,所以我不确定性能是否受到影响我想使用(列表功能)但不知道从哪里开始,我正在使用更高版本统一 2017.3.1f1。非常感谢您的帮助。脚本如下。

public class RandomAIProjectile
{
    private GameObject[] target;
    
    public float speed;
    
    Rigidbody2D bulletRB;
    
    public GameObject explosionEffect;
    
    // Find Targets Section.
    void Start () 
    {
        if (target == null)
            target = GameObject.FindGameObjectsWithTag("Player");
        
        for (int i = 0; i < target.Length; i++) 
        {
            bulletRB = GetComponent<Rigidbody2D> ();
            
            Vector2 moveDir = (target[i].transform.position - transform.position).normalized * speed;
            
            bulletRB.velocity = new Vector2 (moveDir.x, moveDir.y);
            
            Destroy (this.gameObject, 2);
        }
        
    }
    
    private void OnTriggerEnter2D(Collider2D other)
    {
        // Decoy Script To Destroy Players.
        if (other.gameObject.GetComponent<BlackthronpodDiePlayer>() != null)
        {
            Destroy (other.gameObject);
            Destroy (gameObject); 
        }
        // Damage Effect.
        if (other.gameObject.tag == "Player") {
            Instantiate (explosionEffect, transform.position, Quaternion.identity);
            Destroy(gameObject);
        }
        // Player (Bullet) Destroy Enemy.
        if (other.CompareTag ("Bullet"))
        {
            Destroy (other.gameObject);
            Destroy (gameObject); 
        }
        
        
    }
}

这是播放器脚本

public class RandomAIEnemy
{
    //Random Movement
    
    public float speed;
    
    public float waitTime;
    
    public float startWaitTime;
    
    public Transform moveSpots;
    
    public float minX;
    public float minY;
    
    public float maxX;
    public float maxY;
    
    //Enemy AI Shooting 
    
    public float lineOfSite;
    
    public float shootingRange;
    
    public float fireRate = 1f;
    
    private float nextFireTime;
    
    public GameObject bullet;
    
    public GameObject bulletParent;

    // My Current Player
    private BlackthronpodPlayerX playerX;

    // Player AI
    private GameObject[] player;

    public GameObject blood;
    
    Vector3 respawn = new Vector3 (-34f,0,0);
    
    //Additional Info
    
    
    void FixedUpdate () 
    {
        EnemyS ();
    }
    
    // Use this for initialization
    void Start () 
    {
        //My Player AI Tag.
        player = GameObject.FindGameObjectsWithTag("Player");
        
        waitTime = startWaitTime;

        //My Current Player Tag.
        playerX = GameObject.FindGameObjectWithTag ("Player").GetComponent<BlackthronpodPlayerX>();

        //Random Movement Reference
        moveSpots.position = new Vector2 (Random.Range (minX, maxX), Random.Range (minY, maxY));
    }


     //Closest (My Player Including Player AI.)
    private bool TryGetClosestPlayer(out GameObject closest)
    {
        var playersSortedByDistance = player.OrderBy(p => ((Vector2)p.transform.position - (Vector2)transform.position).sqrMagnitude);
        closest = playersSortedByDistance.FirstOrDefault();
        return closest;
    }

    
    void EnemyS () 
    {
        GameObject closestPlayer = null;
        
        if(TryGetClosestPlayer (out closestPlayer))
        {
            var distanceFromPlayer = Vector2.Distance (closestPlayer.transform.position, transform.position);
            
            if (distanceFromPlayer <= shootingRange && nextFireTime < Time.time) 
            {
                Instantiate (bullet, bulletParent.transform.position, Quaternion.identity);
                
                nextFireTime = Time.time + fireRate;
                
            }
        }
    }
    
    // Range And Shooting Boundary For Player Including Player AI.
    private void OnDrawGizmosSelected () 
    {
        Gizmos.color = Color.blue;
        Gizmos.DrawWireSphere (transform.position, lineOfSite);
        Gizmos.DrawWireSphere (transform.position, shootingRange);
        
    }
    
    // Random Movement (I).
    void RandomMove () 
    {
        //Rotate Movement Of Enemy.
        transform.position = Vector2.MoveTowards (transform.position, moveSpots.position, speed * Time.deltaTime);
        
        if (Vector2.Distance (transform.position, moveSpots.position) < 0.2f)
            
        {
            if(waitTime <= 0)
            {   
                moveSpots.position = new Vector2 (Random.Range (minX, maxX), Random.Range (minY, maxY));
                waitTime = startWaitTime;
                
            } else {
                
                waitTime -= Time.deltaTime;
                
            }
        }
    }
    
        
    private void OnTriggerEnter2D(Collider2D collision)
    {
        // Damage Effect On Enemy.
        if (collision.gameObject.tag.Equals ("Player")) 
        {
            Instantiate(blood,transform.position, Quaternion.identity);
        }

        // My Players Health.
        if (collision.CompareTag ("Player")) 
        {
            playerX.health --;
            Debug.Log(playerX.health);
            Destroy(gameObject);
        }

        // Player Score Manager.
        if (collision.tag == "Bullet")
        {
            Game.AddToScore(1);
            
            Destroy(gameObject);
        }
        
        
    }
    
}

【问题讨论】:

  • 你的代码很混乱。所以你似乎只在生成时选择玩家。但是我确定如果您添加一些调试语句以查看您将找到答案的值是什么

标签: c# unity3d 2d


【解决方案1】:

确保您已将 Rigidbody2d 附加到您的敌人和玩家身上。另外,代码中是否有任何错误?

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
  • 我不确定他在哪里卡住了,错误在哪里,或者他对他编写的代码有什么期望?如果您可以选择发表评论并澄清这些疑问,那么这个问题就不会发生。希望你能理解。
  • 我卡住的地方是我的 EnemyAi 只射击一个物体(玩家)并且即使在最近的地方我的 EnemyAi 射击第一个生成的玩家,而其他玩家在里面时也不会再射击射击场。我承认我的代码很乱?
  • 发生这种情况是因为在 AI 射击并摧毁玩家之后,没有名为“玩家”的游戏对象,因此它将返回 null。让代码循环解决问题。
  • 循环不是任何一种函数,但它是一个重复多次的指令序列,直到达到某个或特殊条件或直到处理器可以支持它。您可以使用 for、foreach 和 while 循环来保持语句的重复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多