Есть шар который я хочу вращать вокруг своей оси вперед .
Сам вопрос был бы очень легкий ,если бы не одно но.
Движение объекта:
rb.MovePosition(transform.position + (transform.forward * Time.deltaTime *speed));
Для того чтобы изменять направления персонажа я его поворачиваю т.е. мне нужно использовать forward
для того , что персонаж мог не просто идти вперед по оси X,а и изменять направления и двигаться по нему вперед.Но как вы понимаете если я просто начну вращать его например вот так transform.Rotate(Vector3.right *3)
,то и forward
не будет работать корректно.
Поворот объекта :
private Touch touch1;
private Vector2 TouchPosition;
private Quaternion rotationY;
private float rotateSpeedModifier = 0.7f;
void Update()
{
if (Input.touchCount > 0)
{
touch1 = Input.GetTouch(0);
if (touch1.phase == TouchPhase.Moved)
{
rotationY = Quaternion.Euler(
0f,
touch1.deltaPosition.x * rotateSpeedModifier,
0f);
transform.rotation = rotationY * transform.rotation;
}
}
}
Единственным выходом я вижу как то поменять механику движения,но как?
//Поворот анимацией ,наверное,плохая идея.
Оптимальным путем будет использовать физическое движение, а не вращать + двигать вперед.
using UnityEngine;
//эта строчка гарантирует что наш скрипт не завалится
//ести на плеере будет отсутствовать компонент Rigidbody
[RequireComponent(typeof(Rigidbody))]
public class Movement : MonoBehaviour
{
public float Speed = 10f;
public float JumpForce = 300f;
//что бы эта переменная работала добавьте тэг "Ground" на вашу поверхность земли
private bool _isGrounded;
private Rigidbody _rb;
void Start()
{
_rb = GetComponent<Rigidbody>();
}
// обратите внимание что все действия с физикой
// необходимо обрабатывать в FixedUpdate, а не в Update
void FixedUpdate()
{
MovementLogic();
JumpLogic();
}
private void MovementLogic()
{
float moveHorizontal = Input.GetAxis("Horizontal");
float moveVertical = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
_rb.AddForce(movement * Speed);
}
private void JumpLogic()
{
if (Input.GetAxis("Jump") > 0)
{
if (_isGrounded)
{
_rb.AddForce(Vector3.up * JumpForce);
// Обратите внимание что я делаю на основе Vector3.up
// а не на основе transform.up. Если персонаж упал или
// если персонаж -- шар, то его личный "верх" может
// любое направление. Влево, вправо, вниз...
// Но нам нужен скачек только в абсолютный вверх,
// потому и Vector3.up
}
}
}
void OnCollisionEnter(Collision collision)
{
IsGroundedUpate(collision, true);
}
void OnCollisionExit(Collision collision)
{
IsGroundedUpate(collision, false);
}
private void IsGroundedUpate(Collision collision, bool value)
{
if (collision.gameObject.tag == ("Ground"))
{
_isGrounded = value;
}
}
}
код взят с темы: Правильная реализация передвижения персонажа
а там взят с документации юнити и доработан.
В твоем случае тебе нужно вырезать логику прыжка, а так же залочить обьект по высоте (y) при касании "земли", на сколько я понимаю.
Но если уж отвечать на сам поставленный вопрос: как вращать шар вокруг своей оси...
для этого нужно использовать просто Rotate. Но самое главное что нужно учесть, что бы pivot point был в центре обьекта. Т.к. вращаться обьект будет именно вокруг него.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Возникла задача по реализации OAuth fat клиента при уже существующем серверном приложенииПроблема в том, что клиент может быть подключен к серверу...
Допустим, есть класс Player, который внутри себя хранит экземпляр интерфейса IWeapon
Мне нужно написать аналог Windows Service под Linux на MonoDevelop, который будет запускаться/завершаться из-под другой программы (как дочерний процесс)Реально...
Вроде бы простой вопрос, только я не нашел соответствующего свойства в спискеВозможно ли это вообще? Прошу не предлагать ToolStripMenuItem