Fazer o personagem apontar na direção do movimento
3 participantes
Página 1 de 1
Fazer o personagem apontar na direção do movimento
Bom... basicamente eu queria fazer meu personagem apontar pra direção que ele se move, por exemplo, se ele estiver se movendo pra direita, ele rotaciona pra direita, se ele se mover pra esquerda, ele rotaciona pra esquerda, como é na maioria dos jogos 3d, tipo mario galaxy... porém não é tão simples, porque meu personagem se move em um planeta com um sistema de gravidade esférica e usa rigidbody... esse é o script de movimento
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public GameObject Planet;
public GameObject PlayerPlaceholder;
public float speed = 4;
public float JumpHeight = 1.2f;
float gravity = 100;
bool OnGround = false;
float distanceToGround;
Vector3 Groundnormal;
public Animator Animations;
public float AnimationActivation;
private Rigidbody rb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody>();
rb.freezeRotation = true;
}
// Update is called once per frame
void Update()
{
//MOVEMENT
float x = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
float z = Input.GetAxis("Vertical") * Time.deltaTime * speed;
AnimationActivation = Mathf.Abs(x) + Mathf.Abs(z);
transform.Translate(x, 0, z);
//Local Rotation
if (Input.GetKey(KeyCode.E))
{
transform.Rotate(0, 150 * Time.deltaTime, 0);
}
if (Input.GetKey(KeyCode.Q))
{
transform.Rotate(0, -150 * Time.deltaTime, 0);
}
//Jump
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(transform.up * 40000 * JumpHeight * Time.deltaTime);
}
//GroundControl
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(transform.position, -transform.up, out hit, 10))
{
distanceToGround = hit.distance;
Groundnormal = hit.normal;
if (distanceToGround <= 0.2f)
{
OnGround = true;
}
else
{
OnGround = false;
}
}
//GRAVITY and ROTATION
Vector3 gravDirection = (transform.position - Planet.transform.position).normalized;
if (OnGround == false)
{
rb.AddForce(gravDirection * -gravity);
}
//
Quaternion toRotation = Quaternion.FromToRotation(transform.up, Groundnormal) * transform.rotation;
transform.rotation = toRotation;
if (AnimationActivation != 0)
{
Animations.SetInteger("AnimationState", 1);
}
else if (AnimationActivation == 0)
{
Animations.SetInteger("AnimationState", 0);
}
}
//CHANGE PLANET
private void OnTriggerEnter(Collider collision)
{
if (collision.transform != Planet.transform)
{
Planet = collision.transform.gameObject;
Vector3 gravDirection = (transform.position - Planet.transform.position).normalized;
Quaternion toRotation = Quaternion.FromToRotation(transform.up, gravDirection) * transform.rotation;
transform.rotation = toRotation;
rb.velocity = Vector3.zero;
rb.AddForce(gravDirection * gravity);
PlayerPlaceholder.GetComponent<TutorialPlayerPlaceholder>().NewPlanet(Planet);
}
}
}
GattiMene- Membro
- PONTOS : 2337
REPUTAÇÃO : 2
Respeito as regras :
Re: Fazer o personagem apontar na direção do movimento
GattiMene escreveu:Bom... basicamente eu queria fazer meu personagem apontar pra direção que ele se move, por exemplo, se ele estiver se movendo pra direita, ele rotaciona pra direita, se ele se mover pra esquerda, ele rotaciona pra esquerda, como é na maioria dos jogos 3d, tipo mario galaxy... porém não é tão simples, porque meu personagem se move em um planeta com um sistema de gravidade esférica e usa rigidbody... esse é o script de movimentoPrecisava muito disso, quem puder ajudar agradeço...
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public GameObject Planet;
public GameObject PlayerPlaceholder;
public float speed = 4;
public float JumpHeight = 1.2f;
float gravity = 100;
bool OnGround = false;
float distanceToGround;
Vector3 Groundnormal;
public Animator Animations;
public float AnimationActivation;
private Rigidbody rb;
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody>();
rb.freezeRotation = true;
}
// Update is called once per frame
void Update()
{
//MOVEMENT
float x = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
float z = Input.GetAxis("Vertical") * Time.deltaTime * speed;
AnimationActivation = Mathf.Abs(x) + Mathf.Abs(z);
transform.Translate(x, 0, z);
//Local Rotation
if (Input.GetKey(KeyCode.E))
{
transform.Rotate(0, 150 * Time.deltaTime, 0);
}
if (Input.GetKey(KeyCode.Q))
{
transform.Rotate(0, -150 * Time.deltaTime, 0);
}
//Jump
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(transform.up * 40000 * JumpHeight * Time.deltaTime);
}
//GroundControl
RaycastHit hit = new RaycastHit();
if (Physics.Raycast(transform.position, -transform.up, out hit, 10))
{
distanceToGround = hit.distance;
Groundnormal = hit.normal;
if (distanceToGround <= 0.2f)
{
OnGround = true;
}
else
{
OnGround = false;
}
}
//GRAVITY and ROTATION
Vector3 gravDirection = (transform.position - Planet.transform.position).normalized;
if (OnGround == false)
{
rb.AddForce(gravDirection * -gravity);
}
//
Quaternion toRotation = Quaternion.FromToRotation(transform.up, Groundnormal) * transform.rotation;
transform.rotation = toRotation;
if (AnimationActivation != 0)
{
Animations.SetInteger("AnimationState", 1);
}
else if (AnimationActivation == 0)
{
Animations.SetInteger("AnimationState", 0);
}
}
//CHANGE PLANET
private void OnTriggerEnter(Collider collision)
{
if (collision.transform != Planet.transform)
{
Planet = collision.transform.gameObject;
Vector3 gravDirection = (transform.position - Planet.transform.position).normalized;
Quaternion toRotation = Quaternion.FromToRotation(transform.up, gravDirection) * transform.rotation;
transform.rotation = toRotation;
rb.velocity = Vector3.zero;
rb.AddForce(gravDirection * gravity);
PlayerPlaceholder.GetComponent<TutorialPlayerPlaceholder>().NewPlanet(Planet);
}
}
}
Vê se isso consegue te ajudar:
zuziv- Iniciante
- PONTOS : 2947
REPUTAÇÃO : 4
Idade : 19
Áreas de atuação : C#, Python, Mysql, PHP, HTML, CSS, Linux, Segurança da informação.
Respeito as regras :
Re: Fazer o personagem apontar na direção do movimento
Mais ou menos... porque nesse script não tem nada que faça o player rotacionar pra direção do movimento...
GattiMene- Membro
- PONTOS : 2337
REPUTAÇÃO : 2
Respeito as regras :
Re: Fazer o personagem apontar na direção do movimento
Taaalvez, mas apenas tallvez, esse tutorial ajude:
Mas montando rápidamente a lógica aqui na minha mente, talvez tenha que usar Vector3.Dot pra algumas coisas ai no meio.
Mas montando rápidamente a lógica aqui na minha mente, talvez tenha que usar Vector3.Dot pra algumas coisas ai no meio.
Tópicos semelhantes
» Como fazer o personagem me atacar e fazer o personagem morrer??
» Objeto continuar em movimento após tira o dedo da direção
» Alguém poderia fazer uma aula de como criar um sistema de fazer o personagem trocar de equipamento?
» Movimento de personagem 2d
» Direção da animação do personagem parado usando blend trees
» Objeto continuar em movimento após tira o dedo da direção
» Alguém poderia fazer uma aula de como criar um sistema de fazer o personagem trocar de equipamento?
» Movimento de personagem 2d
» Direção da animação do personagem parado usando blend trees
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos