Я использую новую систему ввода, стартовый актив — контроллер от третьего лица.
Я хотел включить новый ввод и анимацию (от Mixamo). Что я успешно поставил. Однако есть проблема: когда я нажимаю Z, чтобы сидеть, а затем перемещаю WASD, игрок может двигаться, сидя.
Я хочу, чтобы игрок не двигался (или отключал движение) при выполнении анимации «Сидеть».
СтартерАссетсинпутс.cs
[Header("Character Input Values")]
public Vector2 move;
public Vector2 look;
public bool jump;
public bool sprint;
public bool sit; //my input
[Header("Movement Settings")]
public bool analogMovement;
[Header("Mouse Cursor Settings")]
public bool cursorLocked = true;
public bool cursorInputForLook = true;
public bool disableMovement = false; //my input
public void OnSit(InputValue value)
{
SitInput(value.isPressed);
}
public void SitInput(bool newSitInput)
{
if (newSitInput)
{
sit = !sit;
disableMovement = sit;
}
}
ThirdPersonControllers.cs
// animation IDs
private int _animIDSpeed;
private int _animIDGrounded;
private int _animIDJump;
private int _animIDFreeFall;
private int _animIDMotionSpeed;
private int _animIDSit; //my input
ENABLE_INPUT_SYSTEM
private PlayerInput _playerInput;
#endif
private Animator _animator;
private CharacterController _controller;
private StarterAssetsInputs _input;
private GameObject _mainCamera;
private const float _threshold = 0.01f;
private bool _hasAnimator;
private void Update()
{
_hasAnimator = TryGetComponent(out _animator);
JumpAndGravity();
GroundedCheck();
Move();
Sit();
}
private void AssignAnimationIDs()
{
_animIDSpeed = Animator.StringToHash("Speed");
_animIDGrounded = Animator.StringToHash("Grounded");
_animIDJump = Animator.StringToHash("Jump");
_animIDFreeFall = Animator.StringToHash("FreeFall");
_animIDMotionSpeed = Animator.StringToHash("MotionSpeed");
_animIDSit = Animator.StringToHash("Sitting");//my input
}
void Sit()
{
if (_hasAnimator)
{
_animator.SetBool(_animIDSit, _input.sit);
}
}
Что я пробовал: я поместил код непосредственно в StarterAssetsInputs.cs и ThirdPersonControllers.cs, которые уже доступны в Unity Store. Я просто разместил свой код в соответствии с некоторыми YT и форумом.
Чего я ожидал, так это... Я хочу, чтобы игрок не двигался (или отключал движение) при выполнении анимации «Сидеть».
Спасибо.
В общем смысле, чтобы принимать решения, вам нужно знать состояние вашего персонажа. создайте перечисление и добавьте к нему состояния. затем, если вы сидите, игнорируйте данные, поступающие от вашей программы движений.
Привет MaxPlay! Спасибо за ответ, оценил!
Привет, никтоБолее, да, мне нужно узнать состояние. Я делаю это для прототипа. но спасибо за ответ, ценю это!
В Update
, где вы управляете движением, вы можете остановить его, выполнив простую проверку:
private void Update()
{
_hasAnimator = TryGetComponent(out _animator);
if (!_input.disableMovement) // Check if movement is disabled
{
JumpAndGravity();
GroundedCheck();
Move();
}
Sit();
}
Поскольку вы отключаете движение, оно не должно позволять вам двигаться, и вы также можете выполнить простой возврат, например:
private void Move()
{
if (_input.disableMovement) return;
}
Но также убедитесь, что аниматор обновлен в ThirdPersonController
.
Привет, это сработало! Большое спасибо за Ваш ответ! Оценил это!
Я рад, что это сработало!
Разве вы не можете просто иметь
bool canMovement = true;
, который вы устанавливаете наfalse
, когда хотите отключить движение, и в своемUpdate()
вы добавляетеif (canMove)
над своимMove()
-вызовом?