C# 在Unity C中获取值的问题

C# 在Unity C中获取值的问题,c#,unity3d,C#,Unity3d,我无法从variableVector2获取值 我的目标是将float变量从PlayerAttack发送到PlayerAttack public class PlayerAttack : MonoBehaviour { [Header("Components")] [SerializeField] private Rigidbody2D _Player_Rigidbody; [SerializeField] private Camera

我无法从variableVector2获取值

我的目标是将float变量从PlayerAttack发送到PlayerAttack

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继承的PlayerTacking脚本也必须启动

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);
    }
}
您可以看到调试日志

为什么最后一个日志等于0:0?如果问题不是由于代码中的错误导致的,我如何更改该值


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

调用FindAttackAngle\u 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);