C# 统一2D&x27;攻击()';是一个局部函数,因此必须始终具有主体
我试图创建一个名为“Attack()”的函数,如果玩家在Unity 2D中面对不同的方向,它将以不同的方式出现,但我得到了上面提到的错误。我也得到这个错误“‘攻击’在当前上下文中不存在”。我对Unity相当陌生,所以请耐心等待。这是密码 `公共类玩家Combat:单一行为{C# 统一2D&x27;攻击()';是一个局部函数,因此必须始终具有主体,c#,function,unity3d,C#,Function,Unity3d,我试图创建一个名为“Attack()”的函数,如果玩家在Unity 2D中面对不同的方向,它将以不同的方式出现,但我得到了上面提到的错误。我也得到这个错误“‘攻击’在当前上下文中不存在”。我对Unity相当陌生,所以请耐心等待。这是密码 `公共类玩家Combat:单一行为{ public Transform AttackAreaRight; public float AttackRangeRight = 0.5f; public float AttackRangeLeft = 0.5f; pub
public Transform AttackAreaRight;
public float AttackRangeRight = 0.5f;
public float AttackRangeLeft = 0.5f;
public Transform AttackAreaLeft;
public bool IsFacingRight = true;
public bool IsFacingLeft = false;
public LayerMask EnemyLayers;
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
IsFacingRight = false;
IsFacingLeft = true;
Debug.Log("FacingLeft");
}
if (Input.GetKeyDown(KeyCode.D))
{
IsFacingLeft = false;
IsFacingRight = true;
Debug.Log("FacingRight");
}
if (Input.GetKeyDown(KeyCode.F))
{
Attack();
}
if (IsFacingRight = true) ;
{
void Attack()
{
Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(AttackAreaRight.position, AttackRangeRight, EnemyLayers);
foreach (Collider2D enemy in hitEnemies)
{
Debug.Log("LMAORight");
}
}
}
if (IsFacingLeft = true) ;
{
void Attack();
{
Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(AttackAreaLeft.position, AttackRangeLeft, EnemyLayers);
foreach (Collider2D enemy in hitEnemies)
{
Debug.Log("LMAOLeft");
}
}
}
}
}
`所以这里有几个问题。这才是你想要的
public Transform AttackAreaRight;
public float AttackRangeRight = 0.5f;
public float AttackRangeLeft = 0.5f;
public Transform AttackAreaLeft;
public bool IsFacingRight = true;
public LayerMask EnemyLayers;
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
IsFacingRight = false;
Debug.Log("FacingLeft");
}
if (Input.GetKeyDown(KeyCode.D))
{
IsFacingRight = false;
Debug.Log("FacingRight");
}
if (Input.GetKeyDown(KeyCode.F))
{
Attack();
}
}
void Attack()
{
Vector2 attackPosition;
float attackRange;
if (IsFacingRight)
{
attackPosition = AttackAreaRight.position;
attackRange = AttackRangeRight;
}
else
{
attackPosition = AttackAreaLeft.position;
attackRange = AttackRangeLeft;
}
Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackPosition, attackRange, EnemyLayers);
foreach (Collider2D enemy in hitEnemies)
{
Debug.Log("Attacked");
}
}
第一个问题是在函数中声明了一个函数。Update()是一个每帧调用一次的统一函数,因此在它内部不能声明一个函数(这就是您使用void Attack()所做的)
现在,如果要为角色的方向(左/右)设置一个值,那么只需1个布尔值就更容易了,这样以后就不会出现类似IsLeft bieng true和IsRight true的错误。因为如果islight为true,那么IsLeft必须为false,依此类推
然后,您可以在攻击函数中检查此布尔值,并为重叠圆设置相应的数据。我不确定它是否正常工作,但至少现在没有给出编译错误。 如果你能测试一下的话
using UnityEngine;
public class PlayerCombat : MonoBehaviour
{
public Transform AttackAreaRight;
public float AttackRangeRight = 0.5f;
public float AttackRangeLeft = 0.5f;
public Transform AttackAreaLeft;
public bool IsFacingRight = true;
public bool IsFacingLeft = false;
public LayerMask EnemyLayers;
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
IsFacingRight = false;
IsFacingLeft = true;
Debug.Log("FacingLeft");
}
if (Input.GetKeyDown(KeyCode.D))
{
IsFacingLeft = false;
IsFacingRight = true;
Debug.Log("FacingRight");
}
if (Input.GetKeyDown(KeyCode.F)){
Attack();
}
}
private void Attack()
{
if (IsFacingLeft == true && IsFacingRight == false)
{
Collider2D[] hitEnemies =
Physics2D.OverlapCircleAll(AttackAreaLeft.position, AttackRangeLeft, EnemyLayers);
foreach (Collider2D enemy in hitEnemies)
{
Debug.Log("LMAOLeft");
}
}
else if (IsFacingRight == true && IsFacingLeft == false)
{
Collider2D[] hitEnemies =
Physics2D.OverlapCircleAll(AttackAreaRight.position, AttackRangeRight, EnemyLayers);
foreach (Collider2D enemy in hitEnemies)
{
Debug.Log("LMAORight");
}
}
}
}
你在if语句中声明了“attack”(jn-fact 2),如果你按F,你希望攻击做什么?你可以在函数中声明函数,它们被称为局部函数,这是C#7的特性