using UnityEngine;
using System.Collections;
public class AIEnemy : MonoBehaviour {
public GameObject bullet;
public float bulletSpeed = 10;
public Transform player;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void FixedUpdate () {
}
void OnTriggerStay2D(Collider2D col)
{
if(col.tag == "Player")
{
// Debug.DrawRay(transform.position, player.position - transform.position);
RaycastHit2D rhit2d = Physics2D.Raycast(transform.position, player.position - transform.position, Mathf.Infinity);
if (rhit2d.collider.tag == "Player")
{
var clone = Instantiate(bullet, transform.position, Quaternion.identity) as Rigidbody2D;
clone.velocity = (player.position - transform.position * bulletSpeed);
}
}
}
}
所以这是我的代码。当玩家停留在扳机对撞机时,它会找到玩家并向其射击。但我的问题是,子弹并没有朝向刚落下的玩家。我已经将子弹设置为触发器,这不是问题所在。 (这是一个2D游戏顺便说一句)该项目在Github:https://github.com/Massaxe/2D-AI/
答案 0 :(得分:1)
我立即看到的一个问题与bullet
类型为GameObject
的事实有关。我将假设此GameObject
引用是您构建并链接到AIEnemy
实例的预制件。这里需要注意的关键是,GameObject
通常充当一个到多个Component
个实例的容器,Rigidbody2D
是一个实例。以下代码是我用来访问Rigidbody2D
组件的代码:
var clone = Instantiate(bullet, transform.position, Quaternion.identity) as GameObject;
var rigidBody = clone.GetComponent<Rigidbody2D>();
rigidBody.velocity = (player.position - transform.position * bulletSpeed);
至于数学,我会像这样计算速度:
var vel = player.position - transform.position;
vel.Normalize();
vel *= bulletSpeed;
rigidBody.velocity = vel;
这样做,是计算2个位置之间的向量,但是,在应用子弹速度之前,它会对向量进行标准化(意味着,向量的大小为1,但保持适当的方向)。然后,将子弹速度应用于规范化矢量。
为了进一步扩展这一点,我想指出,如果子弹自身坠落,很可能会对子弹施加二维引力,这可能是也可能不是你想要的。此外,还应检查阻力系数,就好像它是任何大于0的值一样,它会导致子弹随着时间的推移而减速(将其视为摩擦力)。