【问题标题】:Unity: My enemy projectile is being destroyed before ever leaving it's spawn location. What am i doing wrong?团结:我的敌人射弹在离开它的生成位置之前就被摧毁了。我究竟做错了什么?
【发布时间】:2023-03-20 17:38:01
【问题描述】:

正如标题所说,敌人的弹丸没有发射。它们在同一个地方生成和销毁。他们不会向目标开火。链接中的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonkeyController : MonoBehaviour {

    private const int MAX_INJURES = 1;

    public float DurationMovement = 2f;
    public Transform SpawnLocation;
    public Transform[] PatrolPoints;
    public GameObject MonkeyProjectile;
    public Rigidbody2D Abby;
    public float AttackDelay = 0.75f;
    public float ProjectileSpeed = 1;
    public int ProjectilesCount = 4;

    public float activePosition;
    public float passivePosition;

    private List<GameObject> ProjectileList = new List<GameObject>();
    private int PatrolIndex = 0;


    private int injures = 0;

    private bool canPatrol;

    private Coroutine fireCoroutine;
    private Coroutine patrolCoroutine;
    private Coroutine movementCoroutine;

    WaitForSeconds delay;
    Vector2 AttackVector = Vector2.zero;
    // Use this for initialization
    private void Start () {
        delay = new WaitForSeconds(AttackDelay);
        InitializeProjectileList();

        fireCoroutine   = StartCoroutine(MonkeyFireProjectileBehaviour());
        patrolCoroutine = StartCoroutine(PatrolBehaviour(PatrolPoints[PatrolIndex].position));
    }


    private IEnumerator MonkeyFireProjectileBehaviour()
    {
        yield return delay;

        if (GameManager.GetInstance().gameState == GameState.GAME_OVER)
            yield return null;

        AttackVector = Abby.transform.position - (transform.position /*+ (Vector3)Abby.velocity/10f*/);

        FireProjectile(AttackVector);

        fireCoroutine = StartCoroutine(MonkeyFireProjectileBehaviour());
    }


    private IEnumerator PatrolBehaviour(Vector3 animationLocation)
    {
        canPatrol = true;

        float distance = (transform.position - animationLocation).magnitude;
        float duration = DurationMovement;

        Vector3 startingPos = transform.position;
        float t = 0;
        while (t < 1 && canPatrol)
        {
            t += Time.deltaTime / duration;
            transform.position = Vector3.Lerp(startingPos, animationLocation, t);
            yield return null;
        }

        if (!canPatrol)
            yield break;

        transform.position = animationLocation;
        IncrementMovementIndex();

        patrolCoroutine = StartCoroutine(PatrolBehaviour(PatrolPoints[PatrolIndex].position));

        yield return null;
    }

    private void IncrementMovementIndex()
    {
        PatrolIndex++;
        if(PatrolIndex == PatrolPoints.Length)
        {
            PatrolIndex = 0;
        }
    }
    private void InitializeProjectileList()
    {
        GameObject Projectile;
        for (int i = 0; i < ProjectilesCount; i++)
        {
            Projectile = Instantiate(MonkeyProjectile);
            Projectile.SetActive(false);
            ProjectileList.Add(Projectile);
        }
    }
    private void FireProjectile(Vector2 forceProjectile)
    {
        foreach (GameObject projectile in ProjectileList)
        {
            if (!projectile.activeInHierarchy)
            {
                projectile.transform.position = SpawnLocation.position;
                projectile.SetActive(true);
                projectile.GetComponent<TrailRenderer>().enabled = true;
                projectile.GetComponent<Rigidbody2D>().bodyType = RigidbodyType2D.Dynamic;
                projectile.GetComponent<Rigidbody2D>().AddForce(forceProjectile * (ProjectileSpeed + Random.Range(0, ProjectileSpeed/2)), ForceMode2D.Impulse);
                break;
            }
        }
    }

    private IEnumerator DoMovementCoroutine()
    {
        yield return new WaitForSeconds (0.01F);

        transform.localPosition = new Vector2(passivePosition, 0);

        yield return AnimatorExecutive.AnimatePositionCoroutine (gameObject, new Vector2 (activePosition, 0), 5.0F);

        fireCoroutine   = StartCoroutine(MonkeyFireProjectileBehaviour());
        patrolCoroutine = StartCoroutine(PatrolBehaviour(PatrolPoints[PatrolIndex].position));
    }



    private void OnCollisionEnter2D(Collision2D otherCollision)
    {
        if (otherCollision.gameObject.tag == "Projectile")
        {
            injures++;

            if (injures >= MAX_INJURES)
            {
                injures = 0;
                canPatrol = false;
                GetComponent<AudioSource>().Play();

                if(fireCoroutine != null)   StopCoroutine (fireCoroutine);
                if(patrolCoroutine != null) StopCoroutine (patrolCoroutine);

                movementCoroutine = StartCoroutine (DoMovementCoroutine());
            }
        }
    }
}

【问题讨论】:

  • 在问题中发布您的代码,还请包含有关您的碰撞设置的信息。
  • gameObject SpawnLocation 有脚本组件吗?你怎么知道弹丸被摧毁了?您在控制台中是否收到任何日志消息或错误消息?

标签: c# unity3d game-physics projectile


【解决方案1】:

根据您提供的信息,我想说您可能面临的问题是您通过检查器获取SpawnLocation 的游戏对象有一个碰撞器和一个带有OnCollisionEnter2D 的脚本,当检测到弹丸时你实例化它并销毁它。

但是,您并没有破坏这个 OnCollisionEnter2D 内的射弹。

private void OnCollisionEnter2D(Collision2D otherCollision)
    {
        if (otherCollision.gameObject.tag == "Projectile")
        {
            injures++;

            if (injures >= MAX_INJURES)
            {
                injures = 0;
                canPatrol = false;
                GetComponent<AudioSource>().Play();

                if(fireCoroutine != null)   StopCoroutine (fireCoroutine);
                if(patrolCoroutine != null) StopCoroutine (patrolCoroutine);

                movementCoroutine = StartCoroutine (DoMovementCoroutine());
            }
        }
    }

如果您的代码中没有任何行可以在碰撞后破坏投射物游戏对象。问题可能是你没有到达这条线projectile.SetActive(true);

我将尝试复制您的代码并检查可能发生的情况

【讨论】:

    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2019-09-08
    • 2019-12-23
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多