访问Unity C#中的值时出现问题



I无法从变量(Vector2(中获取值。

我的目标是将浮动变量从PlayerAttack发送到PlayerAttacking。

public class PlayerAttack : MonoBehaviour
{
[Header("Components")]
[SerializeField]
private Rigidbody2D _Player_Rigidbody;
[SerializeField]
private Camera _Main_Camera;
public Transform target;
public Vector2 offset = Vector2.zero;
private PlayerState CurrentPlayerState;
void Start()
{
}
void Update()
{
Vector3 Mouse = Input.mousePosition;
Vector3 ScreenPoint = _Main_Camera.WorldToScreenPoint(target.localPosition);
// Offset  - help you realize 4 ways attack system
offset = new Vector2(Mouse.x - ScreenPoint.x, Mouse.y - ScreenPoint.y);
Debug.Log("PlayerAttack Log: " + offset.ToString());
FindPlayerState(CurrentPlayerState);
if(VirtualInputManager.Instance.Attack && CurrentPlayerState.ToString() != aro_game.PlayerState.attack.ToString())
{
StartCoroutine(AttackCo());
//Debug.Log("Virtual Input Manager said true and Current state doesnt equal attack");
Debug.Log("ATTACK LOGIC");
}
}
public PlayerState FindPlayerState(PlayerState temp_state)
{
GameObject Object = GameObject.Find("Player");
PlayerMovement PlayerState = Object.GetComponent<PlayerMovement>();
temp_state = PlayerState.CurrentPlayerState;
return temp_state;
}
private IEnumerator AttackCo()
{
CurrentPlayerState = PlayerState.attack;
yield return new WaitForSeconds(0.65f);
CurrentPlayerState = PlayerState.idle;
}
}

然后我创建了一个从这个变量中获取值的方法。(这是CharacterState代码(:

protected void FindAttackAngle(Vector2 temp_angle)
{
GameObject Object = GameObject.Find("Player");
PlayerAttack attackangle = Object.GetComponent<PlayerAttack>();
temp_angle = attackangle.offset;
Debug.Log("CharacterState Log: " + temp_angle.ToString());
}

如果攻击动画启动,则从CharacterState继承的PlayerAttacking脚本也必须启动。

public class PlayerAttacking : CharacterState
{
private PlayerState _state;
private Vector2 _attackangle = Vector2.zero;
public override void OnStateEnter(Animator animator, AnimatorStateInfo animatorStateInfo, int layerIndex)
{
FindAttackAngle(_attackangle);
Debug.Log("PlayerAttackingAnimation Log:" + _attackangle.ToString());
CheckPlayerState(_state);
if (_state != PlayerState.attack)
{
// Front attack
//Debug.Log(_attackangle.ToString());
if ((_attackangle.x < 1f && _attackangle.y < 1f) && (_attackangle.x > -1 && _attackangle.y > 1))
{
Debug.Log("FRONT ATTACK");
animator.SetBool("!Attack", true);
}
//Back attack
if ((_attackangle.x > -1f && _attackangle.y > -1f) && (_attackangle.x < 1 && _attackangle.y < -1f))
{
Debug.Log("BACK ATTACK");
animator.SetBool("!Attack", true);
}
//Left attack
if ((_attackangle.x < -1f && _attackangle.y < -1f) && (_attackangle.x > -1f && _attackangle.y > 1f))
{
Debug.Log("LEFT ATTACK");
animator.SetBool("!Attack", true);
}
//Right attack
if ((_attackangle.x > 1f && _attackangle.y > -1f) && (_attackangle.x < 1f && _attackangle.y < 1f))
{
Debug.Log("RIGHT ATTACK");
animator.SetBool("!Attack", true);
}
}
}
public override void OnStateUpdate(Animator animator, AnimatorStateInfo animatorStateInfo, int layerIndex)
{
}
public override void OnStateExit(Animator animator, AnimatorStateInfo animatorStateInfo, int layerIndex)
{
animator.SetBool("!Attack", false);
animator.SetBool("Attack", false);
}
}

您可以在此处查看调试日志。

为什么最后一个Log等于0:0?如果问题由于代码中的错误而没有发生,我该如何更改此值?

如果您需要更多详细信息,请在评论部分提出您的问题。

调用FindAttackAngle(_attackangle)时出现问题。原因是Vector2是一个结构,而不是对象。您可以在这里阅读作为参数传递结构与作为参数传递对象之间的差异

该链接文章的TLDR版本是,如果将结构变量传递到方法中,则它是通过值传递的。这意味着,如果在方法内部更改结构的字段,则结构在方法外部仍将具有其原始值。相比之下,对象是通过引用传递的,这就是为什么在方法内部对其属性的更改将反映在方法外部(这就是您所期望的(。

要解决此问题,请指定要通过引用传递,如下所示:

// Added the ref keyword on the parameter
protected void FindAttackAngle(ref Vector2 temp_angle)
{
...
}

然后当你呼叫FindAttackAngle

// Added the ref keyword
FindAttackAngle(ref _attackangle);

最新更新