不知道为什么,我已经做了很多次这样的事,但这给了我一些问题。制作一个游戏AI的项目,我已经完成了很多东西,现在只是制作了一些炮塔,如果玩家在某个范围内,它将会发射,我已经开始了。炮塔发射子弹然后由于某种原因他们开始摧毁自己并且他们不会向我的玩家发射。想知道这里是否有人可以提供帮助,提前谢谢!
您可能需要了解的一些细节: 我的炮塔有一个底座,一个枪鼻和一把枪。我的枪有一个GunLook.cs脚本,让它看着玩家(所以当他们射击时应该朝向他们),我不确定这是否与我遇到这些问题有什么关系,但我' ll发布该代码也只是加入
我的炮塔的Hierchy如何 Turret_AI(基地) 枪(Turret_AI的孩子) bulletSpawn(枪的孩子) Gun_Nose(turret_AI的孩子)
bulletSpawn是我创建的一个空GameObject,希望能解决我的问题。我把它放在枪下,这样它就不会与枪碰撞而自我毁灭(我认为它可能会做,但不正确)。
这应该是所有需要的信息,如果有人需要更多,我会每2秒检查一次,所以让我知道,我会尽快回复你。
TurretScript.cs (在任何人问之前,我确实将GameObject设置为Unity中的Player)
using UnityEngine;
using System.Collections;
public class TurretScript : MonoBehaviour {
[SerializeField]
public GameObject Bullet;
public float distance = 3.0f;
public float secondsBetweenShots = 0.75f;
public GameObject followThis;
private Transform target;
private float timeStamp = 0.0f;
void Start () {
target = followThis.transform;
}
void Fire() {
Instantiate(Bullet, transform.position , transform.rotation);
Debug.Log ("FIRE");
}
void Update () {
if (Time.time >= timeStamp && (target.position - target.position).magnitude < distance) {
Fire();
timeStamp = Time.time + secondsBetweenShots;
}
}
}
GunLook.cs
// C#
using System;
using UnityEngine;
public class GunLook : MonoBehaviour
{
public Transform target;
void Update()
{
if(target != null)
{
transform.LookAt(target);
}
}
}
BulletBehavior.cs
using UnityEngine;
using System.Collections;
public class BulletBehavior : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if (rigidbody.velocity.magnitude <= 0.5)
Destroy (gameObject);
}
void OnCollisionEnter(Collision collision)
{
if (collision.collider)
{
if(collision.gameObject.tag == "Enemy" || collision.gameObject.tag == "EnemyProjectile")
{
Physics.IgnoreCollision(rigidbody.collider,collision.collider);
//Debug.Log ("Enemy");
}
if(collision.gameObject.tag == "SolidObject")
{
Destroy(gameObject);
}
if(collision.gameObject.tag == "Player")
{
Destroy(gameObject);
}
}
}
}
答案 0 :(得分:1)
你永远不会移动你的子弹。
public class BulletBehavior : MonoBehaviour
{
private const float DefaultSpeed = 1.0f;
private float startTime;
public Vector3 destination;
public Vector3 origin;
public float? speed;
public void Start()
{
speed = speed ?? DefaultSpeed;
startTime = Time.time;
}
public void Update()
{
float fracJourney = (Time.time - startTime) * speed.GetValueOrDefault();
this.transform.position = Vector3.Lerp (origin, destination, fracJourney);
}
}
然后这样称呼它:
void Fire()
{
GameObject bullet = (GameObject)Instantiate(Bullet, transform.position , transform.rotation);
BulletBehavior behavior = bullet.GetComponent<BulletBehavior>();
behavior.origin = this.transform.position;
behavior.destination = target.transform.position;
Debug.Log ("FIRE");
}
注意:如果你试图将这种方法与尝试使用物理学移动子弹混合使用,你可能会得到奇怪的结果。