#c# #unity3d
#c# #unity3d
Вопрос:
Я не могу получить значения из переменной (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 amp;amp; 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;
}
}
затем я создал метод для получения значений из этой переменной.(Это код состояния символа):
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());
}
И если запускается анимация атаки, сценарий PlayerAttacking, унаследованный от CharacterState, тоже должен запуститься.
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 amp;amp; _attackangle.y < 1f) amp;amp; (_attackangle.x > -1 amp;amp; _attackangle.y > 1))
{
Debug.Log("FRONT ATTACK");
animator.SetBool("!Attack", true);
}
//Back attack
if ((_attackangle.x > -1f amp;amp; _attackangle.y > -1f) amp;amp; (_attackangle.x < 1 amp;amp; _attackangle.y < -1f))
{
Debug.Log("BACK ATTACK");
animator.SetBool("!Attack", true);
}
//Left attack
if ((_attackangle.x < -1f amp;amp; _attackangle.y < -1f) amp;amp; (_attackangle.x > -1f amp;amp; _attackangle.y > 1f))
{
Debug.Log("LEFT ATTACK");
animator.SetBool("!Attack", true);
}
//Right attack
if ((_attackangle.x > 1f amp;amp; _attackangle.y > -1f) amp;amp; (_attackangle.x < 1f amp;amp; _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? И как я могу изменить это значение, если проблема не возникает из-за ошибки в моем коде?
Если вам нужна более подробная информация, задавайте свои вопросы в разделе комментариев pleas.
Ответ №1:
Проблема возникает при вызове, 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);