Sistema de desaceleração usando MovePosition
3 participantes
Página 1 de 1
Sistema de desaceleração usando MovePosition
Boa noite, venho tentando encontrar um jeito de de inserir aceleração no meu personagem usando MovePosition, mas não acho nenhum exemplo usando esse método. Todos os exemplos que eu encontrei por aí até agora falham quando eu tento integrar no meu código. Todo o resto está funcionando corretamente, só que o personagem sai de 0 velocidade até a velocidade máxima de forma praticamente instantânea. Não deve ser muito complicado, mas não estou conseguindo encontrar um jeito de fazer.
O código acima é apenas um exemplo simplificado do meu código atual, que é bem mais complexo. Sei que não devo checar input no FixedUpdate por exemplo... Coloquei tudo em um método só para ficar mais curto, se for de interesse de alguém, eu coloco a classe inteira aqui (cerca de 150 linhas).
- Código:
void FixedUpdate(){
if (inputDirection != Vector2.zero){
movementVector = new Vector3(inputDirection.y, 0, inputDirection.x) * accelerationFactor * Time.fixedDeltaTime;
if(rigidbody.velocity.magnitude <= maxSpeed)
accelerationFactor += accelerationAttribute;
rigidbody.MovePosition(transform.position + movementVector);
}
else
accelerationFactor = 0;
}
O código acima é apenas um exemplo simplificado do meu código atual, que é bem mais complexo. Sei que não devo checar input no FixedUpdate por exemplo... Coloquei tudo em um método só para ficar mais curto, se for de interesse de alguém, eu coloco a classe inteira aqui (cerca de 150 linhas).
Re: Sistema de desaceleração usando MovePosition
O título está errado, obviamente necessito de um jeito de acelerar o player antes de pensar em desacelera-lo.. acabei escrevendo errado e não consigo editar o título do tópico. Se bem que um sistema de acelerar não é nada mais do que um sistema desacelerar ao contrário, então qualquer resposta nesse sentido me ajudaria...
Re: Sistema de desaceleração usando MovePosition
- Código:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.Vehicles.Car;
public class OwnThirdPersonController : MonoBehaviour {
public FixedJoystick LeftJoystick;
//public FixedButton ShootButton;
public FixedButton JumpButton;
public FixedButton CrouchButton;
public FixedTouchField TouchField;
public float JumpForce = 5f;
protected Actions Actions;
protected PlayerController PlayerController;
protected Rigidbody Rigidbody;
protected ParticleSystem ParticleSystem;
protected float CameraAngleY;
protected float CameraAngleSpeed = 0.1f;
protected float CameraPosY = 3f;
protected float CameraPosSpeed = 0.02f;
protected bool isCrouching = false;
protected CapsuleCollider CapCollider;
//car
protected CarController carController;
protected SkinnedMeshRenderer Renderer;
public FixedButton CarButton;
protected float Cooldown;
// Use this for initialization
void Start ()
{
Actions = GetComponent<Actions>();
PlayerController = GetComponent<PlayerController>();
Rigidbody = GetComponent<Rigidbody>();
ParticleSystem = GetComponentInChildren<ParticleSystem>();
CapCollider = GetComponent<CapsuleCollider>();
Renderer = GetComponentInChildren<SkinnedMeshRenderer>();
}
// Update is called once per frame
void Update () {
if (carController == null)
{
Walk();
Shoot();
Jump();
Crouch();
}
CarUpdate();
}
private void CarUpdate()
{
if (carController == null)
{
//check if the player wants to get into a car
if (CarButton.Pressed)
{
CarButton.Pressed = false;
var colliders = Physics.OverlapSphere(transform.position, 2f);
foreach (var collider in colliders)
{
var car = collider.GetComponent<CarController>();
if (car != null)
{
carController = car;
Renderer.gameObject.SetActive(false);
}
}
}
}
else
{
//drive the car
carController.Move(LeftJoystick.Horizontal + Input.GetAxis("Horizontal"), LeftJoystick.Vertical + Input.GetAxis("Vertical"), LeftJoystick.Vertical + Input.GetAxis("Vertical"), 0);
transform.position = carController.transform.position;
Camera.main.transform.position = carController.transform.position + carController.transform.rotation * new Vector3(0, 7, -10);
Camera.main.transform.rotation = Quaternion.LookRotation(carController.transform.position + Vector3.up * 2f - Camera.main.transform.position, Vector3.up);
//get out
if (CarButton.Pressed)
{
CarButton.Pressed = false;
carController = null;
Renderer.gameObject.SetActive(true);
}
}
}
private void Crouch()
{
var crouchbutton = CrouchButton.Pressed || Input.GetKey(KeyCode.C);
if (!isCrouching && crouchbutton)
{
//crouch
CapCollider.height = 0.5f;
CapCollider.center = new Vector3(CapCollider.center.x, 0.25f, CapCollider.center.z);
isCrouching = true;
Actions.Sitting(true);
}
Debug.DrawRay(transform.position, Vector3.up * 2f, Color.green);
if (isCrouching && !crouchbutton)
{
//try to stand up
var cantStandUp = Physics.Raycast(transform.position, Vector3.up, 2f);
if (!cantStandUp)
{
CapCollider.height = 1f;
CapCollider.center = new Vector3(CapCollider.center.x, 0.5f, CapCollider.center.z);
isCrouching = false;
Actions.Sitting(false);
}
}
}
private void Walk()
{
//Control.m_Jump = Button.Pressed;
//Control.Hinput = LeftJoystick.inputVector.x;
//Control.Vinput = LeftJoystick.inputVector.y;
var input = new Vector3(LeftJoystick.inputVector.x, 0, LeftJoystick.inputVector.y);
var vel = Quaternion.AngleAxis(CameraAngleY + 180, Vector3.up) * input * 5f;
transform.rotation = Quaternion.AngleAxis(CameraAngleY + Vector3.SignedAngle(Vector3.forward, input.normalized + Vector3.forward * 0.0001f, Vector3.up) + 180, Vector3.up);
Rigidbody.velocity = new Vector3(vel.x, Rigidbody.velocity.y, vel.z);
CameraAngleY += TouchField.TouchDist.x * CameraAngleSpeed;
CameraPosY = Mathf.Clamp(CameraPosY - TouchField.TouchDist.y * CameraPosSpeed, 0, 5f);
Camera.main.transform.position = transform.position + Quaternion.AngleAxis(CameraAngleY, Vector3.up) * new Vector3(0, CameraPosY, 4);
Camera.main.transform.rotation = Quaternion.LookRotation(transform.position + Vector3.up * 2f - Camera.main.transform.position, Vector3.up);
}
private void Shoot()
{
Cooldown -= Time.deltaTime;
if (Cooldown < 0)
ParticleSystem.Stop();
var ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2f, Screen.height / 2f, 0));
Debug.DrawRay(ray.origin, ray.direction, Color.red);
//if (ShootButton.Pressed)
{
PlayerController.SetArsenal("Rifle");
Actions.Attack();
if (Cooldown <= 0f)
{
Cooldown = 0.3f;
ParticleSystem.Play();
RaycastHit hitinfo;
if (Physics.Raycast(ray, out hitinfo))
{
//var other = hitinfo.collider.GetComponent<Shootable>();
if (other != null)
{
other.GetComponent<Rigidbody>().AddForceAtPosition((hitinfo.point - ParticleSystem.transform.position).normalized * 500f, hitinfo.point);
}
}
}
}
else
{
if (Rigidbody.velocity.magnitude > 3f)
Actions.Run();
else if (Rigidbody.velocity.magnitude > 0.5f)
Actions.Walk();
else
Actions.Stay();
}
}
private void Jump()
{
var grounded = Physics.Raycast(transform.position + Vector3.up * 0.05f, Vector3.down, 0.1f);
Debug.DrawRay(transform.position + Vector3.up * 0.05f, Vector3.down, Color.red, 0.1f);
if (JumpButton.Pressed && grounded)
{
Rigidbody.velocity = new Vector3(Rigidbody.velocity.x, JumpForce, Rigidbody.velocity.z);
Actions.Jump();
}
}
}
}
ander0880- Iniciante
- PONTOS : 1848
REPUTAÇÃO : 0
Respeito as regras :
Re: Sistema de desaceleração usando MovePosition
ander0880 escreveu:
- Código:
private void Walk()
{
//Control.m_Jump = Button.Pressed;
//Control.Hinput = LeftJoystick.inputVector.x;
//Control.Vinput = LeftJoystick.inputVector.y;
var input = new Vector3(LeftJoystick.inputVector.x, 0, LeftJoystick.inputVector.y);
var vel = Quaternion.AngleAxis(CameraAngleY + 180, Vector3.up) * input * 5f;
transform.rotation = Quaternion.AngleAxis(CameraAngleY + Vector3.SignedAngle(Vector3.forward, input.normalized + Vector3.forward * 0.0001f, Vector3.up) + 180, Vector3.up);
Rigidbody.velocity = new Vector3(vel.x, Rigidbody.velocity.y, vel.z);
CameraAngleY += TouchField.TouchDist.x * CameraAngleSpeed;
CameraPosY = Mathf.Clamp(CameraPosY - TouchField.TouchDist.y * CameraPosSpeed, 0, 5f);
Camera.main.transform.position = transform.position + Quaternion.AngleAxis(CameraAngleY, Vector3.up) * new Vector3(0, CameraPosY, 4);
Camera.main.transform.rotation = Quaternion.LookRotation(transform.position + Vector3.up * 2f - Camera.main.transform.position, Vector3.up);
}
}
Bom, obrigado pela resposta. Aparentemente o código que mais se aproxima do que eu precisaria é o método acima, pelo o que eu entendi, tu está movendo o rigidbody alterando a velocity manualmente, o que segundo a documentação pode gerar comportamentos não realistas na física, além de mudar velocidade do rigidbody de forma instantânea, que é justamente o comportamento que eu não quero. Pesquisei algum tempo sobre formas de mover o meu player para o jogo que eu quero, aparentemente o MovePosition() é a escolha correta para o meu caso. Enfim, possivelmente não tenha entendi direito seu código, mas mesmo assim acredito que o teu exemplo não se encaixa no meu caso.
Re: Sistema de desaceleração usando MovePosition
É realmente necessário usar movePosition???
Por que pra mim, o AddForce parece ser o método ideal para o seu caso.
Por que pra mim, o AddForce parece ser o método ideal para o seu caso.
Re: Sistema de desaceleração usando MovePosition
MarcosSchultz escreveu:É realmente necessário usar movePosition???
Por que pra mim, o AddForce parece ser o método ideal para o seu caso.
Bom, pesquisei bastante sobre isso e encontrei esse post:
https://coderwall.com/p/yhrhiw/unity-physics-rules-of-thumb
Foi nele que eu me baseei para usar o MovePosition e MoveRotation no meu caso. Consegui implementar um sistema de aceleração e desaleração nos últimos dias, não ficou uma maravilha mas acho que é um bom ponto de partida.
Tópicos semelhantes
» Sistema de morte na Unity usando o Photon
» Qual o melhor sistema sistema de anuncios para android?
» Como fazer Sistema Dia e Noite Segui o sistema de Hora
» Como criar sistema de Habilidades (Skills) para o personagem 2D / e sistema de batalha 2D
» como fazer sistema de partículas apagar outro sistema de partículas
» Qual o melhor sistema sistema de anuncios para android?
» Como fazer Sistema Dia e Noite Segui o sistema de Hora
» Como criar sistema de Habilidades (Skills) para o personagem 2D / e sistema de batalha 2D
» como fazer sistema de partículas apagar outro sistema de partículas
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos