简体   繁体   English

当玩家进入敌人范围时,试图让敌人向玩家射击弹丸

[英]trying to make an enemy shoot a projectile at the player when the player enters the enemys range

for some reason the projectile is fired but only when the enemy comes into contact with the player and very slowly for some reason. 由于某种原因,射弹会被发射,但是只有当敌人由于某种原因而与玩家接触时才非常缓慢。 below is my code. 下面是我的代码。

(there is a separate script on my projectile but that only deals with damage on the player) (我的弹丸上有一个单独的脚本,但只对玩家造成了伤害)

public class flyingEnemy : MonoBehaviour {


    public int maxHealth = 40;
    Rigidbody2D rb2d;

    public float speed;



    public float attackRange;
    private float lastAttackTime;
    public float attackDelay;

    public Transform target;
    public float chaseRange;

    public GameObject projectile;
    public float bulletForce;
    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        float distanceToTarget = Vector3.Distance(transform.position, target.position);
        if(distanceToTarget < chaseRange)
        {
            //start chasing player
            Vector3 targetDir = target.position - transform.position;
            float angle = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg - 90f;
            Quaternion q = Quaternion.AngleAxis(angle, Vector3.forward);
            transform.rotation = Quaternion.RotateTowards(transform.rotation, q, 180);

            transform.Translate(Vector3.up * Time.deltaTime * speed);

        }
        if(distanceToTarget < attackRange)
        {

            //check to see if its time to attack again
            if (Time.time > lastAttackTime + attackDelay)
            {
                //do we have lineofsight?
                RaycastHit2D Hit = Physics2D.Raycast(transform.position, transform.up,attackRange);
                //what did the raycast hit?
                if (Hit.transform == target)
                {
                    GameObject newBullet = Instantiate(projectile, transform.position, transform.rotation);
                    newBullet.GetComponent<Rigidbody2D>().AddRelativeForce(new Vector2(0f, bulletForce));
                    lastAttackTime = Time.time;
                }
            }
        }


    }

I modified your code and it seems to work now. 我修改了您的代码,现在看来可以了。 I added a 'Player' layer to the player gameobject, then rewrote your script to the following: 我在玩家游戏对象上添加了“玩家”层,然后将脚本重写为以下内容:

using UnityEngine;

public class Enemy : MonoBehaviour
{

public int maxHealth = 40;

public float speed;
public float attackRange;
public float attackDelay;
public float chaseRange;
public float bulletForce;
private float lastAttackTime;
private float distanceToTarget;

public Transform target;
public GameObject projectile;
private Rigidbody2D rb2d;

private void Start()
{
    rb2d = GetComponent<Rigidbody2D>();
}

private void FixedUpdate()
{
    if (distanceToTarget < chaseRange)
    {
        Chase(target.position);
    }
    else
    {
        rb2d.velocity = Vector2.zero;
    }
}

private void Update()
{
    distanceToTarget = Vector3.Distance(transform.position, target.position);

    if (distanceToTarget < attackRange)
    {
        if (Time.time > lastAttackTime + attackDelay)
        {
            RaycastHit2D Hit = Physics2D.Raycast(transform.position, transform.up, attackRange, 1 << LayerMask.NameToLayer("Player"));
            if (Hit)
            {
                Fire();
                lastAttackTime = Time.time;
            }
        }
    }
}

private void Chase(Vector3 target)
{
    Vector3 targetDir = target - transform.position;
    float angle = Mathf.Atan2(targetDir.y, targetDir.x) * Mathf.Rad2Deg - 90f;
    Quaternion q = Quaternion.AngleAxis(angle, Vector3.forward);
    transform.rotation = Quaternion.RotateTowards(transform.rotation, q, 180);
    rb2d.velocity = targetDir.normalized * speed;
}

private void Fire()
{
    GameObject newBullet = Instantiate(projectile, transform.position, transform.rotation);
    newBullet.GetComponent<Rigidbody2D>().AddForce(transform.up * bulletForce, ForceMode2D.Impulse);
}    
}

First, if you have a rigidbody, use that instead of Transform.Translate. 首先,如果您有刚体,请使用它代替Transform.Translate。 Second, make sure your raycast only applies to the Player layer. 其次,确保您的光线投射仅适用于Player层。 Third, rather than 第三,而不是

AddRelativeForce(new Vector2(0f, bulletForce));

use 采用

AddForce(transform.up * bulletForce, ForceMode2D.Impulse);

Fourth, play around with the serialized values until you get the result you want. 第四,处理序列化的值,直到获得所需的结果。 What I did was lower the enemy's speed and increase the bullet force. 我所做的就是降低敌人的速度并增加子弹的力量。 Let me know if you have any questions. 如果您有任何疑问,请告诉我。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM