簡體   English   中英

在 Unity C# 中訪問值的問題

[英]Problem with getting access to values in Unity C#

我無法從變量(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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM