我的子弹使用光线投射来检测它们在物理更新中遗漏的所有内容,但不会造成伤害

my bullets use raycasts to detects everything they miss in a physics update but it doesnt do damage

提问人:kraken 提问时间:9/27/2023 最后编辑:kraken 更新时间:9/28/2023 访问量:39

问:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.Rendering.Universal.Internal;
using static UnityEngine.GraphicsBuffer;
public class Bullet : MonoBehaviour
{

    [Header("References")]
    [SerializeField] private Rigidbody2D rb;

    [Header("Attributes")]
    [SerializeField] private float BulletSpeed = 10f;
    [SerializeField] private LayerMask Enemies;

    public Transform target;
    public Transform StartPoint;
    public int Damage;
    public float ProjecDistance;
    public int Pierce;
    private int Pierced = 0;
    private List<int> HitName = new List<int>();
    private void EnemyHit(RaycastHit2D Hits)
    {
        Hits.collider.gameObject.GetComponent<EnemyMovement>().Damage(Damage);
        HitName.Add(Hits.collider.gameObject.GetComponent<EnemyMovement>().GetInstanceID());
        Pierced += 1;
    }
    void Start()
    {
        Vector2 direction = (target.position - transform.position).normalized;
        Vector2 vector = new Vector2(direction.x, direction.y).normalized;

        rb.velocity = vector * BulletSpeed;

        RaycastHit2D[] Hits = Physics2D.RaycastAll(transform.position, transform.forward, rb.velocity.magnitude * Time.deltaTime, Enemies);
        for (int i = 0; i < Hits.Length; i++)
        {
            if (Pierced >= Pierce)
            {
                Destroy(gameObject);
            }
            if (HitName == null || !HitName.Contains(Hits[i].collider.gameObject.GetComponent<EnemyMovement>().GetInstanceID()))
            {
                EnemyHit(Hits[i]);
            }
        }
    }
    private void Update()
    {
        if (Vector2.Distance(StartPoint.position, transform.position) >= ProjecDistance)
        {
            Destroy(gameObject);
        }
    }
    void FixedUpdate()
    {
        RaycastHit2D[] Hits = Physics2D.RaycastAll(transform.position, transform.forward, rb.velocity.magnitude * Time.deltaTime, Enemies);
        for (int i = 0; i < Hits.Length; i++)
        {
            Debug.Log(Hits[i]);
            if (Pierced >= Pierce)
            {
                Destroy(gameObject);
            }
            if (HitName == null || !HitName.Contains(Hits[i].collider.gameObject.GetComponent<EnemyMovement>().GetInstanceID()))
            {
                EnemyHit(Hits[i]);
            }
        }
    }
}

我试过将光线投射设置为无限长度,但它仍然不会对它应该击中的预制敌人造成伤害,所以我正在做的光线投射或我使用光线投射检测游戏对象的方式有问题。 我不知道还能如何制造出既能穿透又能快速移动的子弹,现在我的子弹速度是 50。

此外,所有值在初始化时都分配给项目符号

C# unity-游戏引擎 2D 光线投射

评论

1赞 Palle Due 9/27/2023
我不明白这个问题。子弹不应该伤害他们击中的东西,而不是他们错过的东西吗?
0赞 BugFinder 9/27/2023
它对什么没有造成损害?它不太清楚
1赞 derHugo 9/27/2023
您的移动方向可能与 ..此外,您使用的最大距离为 ..这是一个小得离谱的......假设帧速率为每秒 60 帧,则该值约为......target.position - transform.positiontransform.forwardrb.velocity.magnitude * Time.deltaTime0.017 * BulletSpeed
0赞 derHugo 9/27/2023
此外,存储 instanceID 似乎有点多余.甚至引用已经是唯一的;)。并检查......为什么会这样?EnemyMovementcollider.gameObjectHitName == nullnull
1赞 derHugo 9/27/2023
为什么要使用光线投射?似乎你可以简单地使用例如/代替......OnCollisionEnter2DOnTriggerEnter2D

答: 暂无答案