【问题标题】:Unity - Raycast do not detect any objectUnity - Raycast 不检测任何物体
【发布时间】:2021-12-28 16:44:08
【问题描述】:

我已经为大学做游戏已经有一段时间了,当我要制作一个敌人探测玩家来攻击他时,我碰壁了。敌人只是看不到玩家,事实上他什么也看不到。我尝试了所有图层和对象,但他只是站着不动。(我还没有对他实施任何动作,因为我想先解决这个问题)。让他攻击的唯一方法是否定“if (PlayerInSight())”,这是有道理的,因为它现在一直返回 true,所以这并没有真正的帮助。这是目前近战敌人的整个脚本。帮助表示赞赏。

using UnityEngine;

public class Melee : MonoBehaviour
{
    [SerializeField] private float attackCooldown;
    [SerializeField] private float range;
    [SerializeField] private float colliderDistance;
    [SerializeField] private int damage;
    [SerializeField] private BoxCollider2D boxCollider;
    [SerializeField] private LayerMask playerLayer;
    private float cooldownTimer = Mathf.Infinity;
    private Animator anim;
    private Health playerHealth;

    private void Awake()
    {
        anim = GetComponent<Animator>();
    }

    private void Update()
    {
        cooldownTimer += Time.deltaTime;
        
        //atakuj tylko kiedy przeciwnik widzi gracza
        if (PlayerInSight())
        {
            if (cooldownTimer >= attackCooldown)
            {
                cooldownTimer = 0;
                anim.SetTrigger("Attack");
            }
        }
    }

 private bool PlayerInSight()
    {
        RaycastHit2D hit = 
            Physics2D.BoxCast(boxCollider.bounds.center + transform.right * range * transform.localScale.x * colliderDistance,
            new Vector3(boxCollider.bounds.size.x * range, boxCollider.bounds.size.y, boxCollider.bounds.size.z),
            0, Vector2.left, 0, playerLayer);

        if (hit.collider != null)
            playerHealth = hit.transform.GetComponent<Health>();

        return hit.collider != null;
    }
    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube(boxCollider.bounds.center + transform.right * range * transform.localScale.x * colliderDistance,
            new Vector3(boxCollider.bounds.size.x * range, boxCollider.bounds.size.y, boxCollider.bounds.size.z));
    }

    private void DamagePlayer()
    {
        if (PlayerInSight())
            playerHealth.TakeDamage(damage);
    }
}

【问题讨论】:

  • 你是如何设置播放器掩码的。就像您将其设置为仅检测玩家一样

标签: c# unity3d


【解决方案1】:

Physics2D.BoxCast的参数和你传入的是什么

origin = boxCollider.bounds.center + transform.right * range * transform.localScale.x * colliderDistance,
size = new Vector3(boxCollider.bounds.size.x * range, boxCollider.bounds.size.y, boxCollider.bounds.size.z),
angle = 0,
direction = Vector2.left,
distance = 0,
layerMask = playerLayer

所以你可以看到你的演员总是有0的最大距离=>很清楚你不会撞到任何东西。

您可能正在寻找 Physics2D.OverlapBox 仅检查固定位置的单个框形状

【讨论】:

    【解决方案2】:

    起初我以为我可能只是改变距离,但那也不起作用。我一直在关注一个教程,那里的距离也设置为 0,但它工作得很好。另一方面,将其更改为 OverlapBox 并不意味着无论如何该框都保持静止?我希望它与敌人一起移动,这就是我使用 BoxCast 的原因。无论如何,我尝试将其更改为 OverlapBox,但没有成功,但我很确定我那里出了点问题。我是一个大初学者,所以还有很多我不明白的东西。 这是带有 OverlapBox 的片段

    private bool PlayerInSight()
    {
        Collider2D hit = Physics2D.OverlapBox(boxCollider.bounds.center + transform.right * range * transform.localScale.x * colliderDistance,
        new Vector3(boxCollider.bounds.size.x * range, boxCollider.bounds.size.y, boxCollider.bounds.size.z),
                0, playerLayer);
    
        if (hit.IsTouching(boxCollider))
             playerHealth = hit.transform.GetComponent<Health>();
    
        return hit.IsTouching(boxCollider);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      • 1970-01-01
      • 2020-11-14
      • 2019-06-23
      • 2013-12-15
      相关资源
      最近更新 更多