由于某种原因,射弹被发射,但仅在敌人出于某种原因而与玩家接触时非常缓慢地发射。 下面是我的代码。
(我的弹丸上有一个单独的脚本,但是只对玩家造成伤害)
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;
}
}
}
}
答案 0 :(得分:0)
我修改了您的代码,现在看来可以了。我在玩家游戏对象上添加了“玩家”层,然后将脚本重写为以下内容:
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);
}
}
首先,如果您有刚体,请使用它代替Transform.Translate。其次,确保您的光线投射仅适用于Player层。 第三,而不是
AddRelativeForce(new Vector2(0f, bulletForce));
使用
AddForce(transform.up * bulletForce, ForceMode2D.Impulse);
第四,处理序列化的值,直到获得所需的结果。我所做的就是降低敌人的速度并增加子弹的力量。如果您有任何疑问,请告诉我。