我一直在為大學做游戲有一段時間了,當涉及到制作敵人檢測玩家以攻擊他時,我撞到了墻。敵人只是看不到玩家,實際上他什么也看不到。我嘗試了所有的圖層和物件,但他只是站著不動。(因為我想先解決這個問題,所以我仍然沒有對他實施任何型別的運動)。讓他攻擊的唯一方法是否定'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);
}
}
uj5u.com熱心網友回復:
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在固定位置僅檢查單個框形狀
uj5u.com熱心網友回復:
起初我以為我可以改變距離,但這也不起作用。我一直在學習教程,那里的距離也設定為 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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/397768.html
