繁体   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