sistema de motocicleta
Página 1 de 1
sistema de motocicleta
estou criando um sistema de motocicleta, vou colocar os codigos que estou usando
Esse 1°codigo é do proprio Marcos. ele colocou em um forum da gringa, funciona bem vou trabalharar em cima dele,
esse 2° foram as temtativas de estabilisar a moto no eixo Z, tem que usar ele jumto com o codigo do carro,
Esse 3° é o codigo do carrto, no lugar de 4 rodas vc pode colocar só 2 não imprementei ainda, tem o turorial do marcos nesse link
https://www.youtube.com/watch?v=SAD5ph3Az88
o problema é, eu consegui estabilisar a moto só que ela fica deslisando para o lado por causa do codigo, tem alguma coisa errada
Esse 1°codigo Motorcycle
esse 2° foram as temtativas de estabilisar a moto no eixo Z, tem que usar ele jumto com o codigo do carro,
EstabilisarMoto
Esse 3° é o codigo do carrto, no lugar de 4 rodas vc pode colocar só 2 não imprementei ainda, tem o turorial do marcos nesse link
https://www.youtube.com/watch?v=SAD5ph3Az88
Esse 1°codigo é do proprio Marcos. ele colocou em um forum da gringa, funciona bem vou trabalharar em cima dele,
esse 2° foram as temtativas de estabilisar a moto no eixo Z, tem que usar ele jumto com o codigo do carro,
Esse 3° é o codigo do carrto, no lugar de 4 rodas vc pode colocar só 2 não imprementei ainda, tem o turorial do marcos nesse link
https://www.youtube.com/watch?v=SAD5ph3Az88
o problema é, eu consegui estabilisar a moto só que ela fica deslisando para o lado por causa do codigo, tem alguma coisa errada
Esse 1°codigo Motorcycle
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(BoxCollider))]
public class Motorcycle : MonoBehaviour
{ //MS Motorcycle test - Marcos Schultz (www.schultzgames.com)
WheelCollider frontWheel;
WheelCollider rearWheel;
GameObject meshFront;
GameObject meshRear;
Rigidbody ms_Rigidbody;
float rbVelocityMagnitude;
float horizontalInput;
float verticalInput;
float medRPM;
void Awake()
{
transform.rotation = Quaternion.identity;
ms_Rigidbody = GetComponent<Rigidbody>();
ms_Rigidbody.mass = 400;
ms_Rigidbody.interpolation = RigidbodyInterpolation.Extrapolate;
ms_Rigidbody.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
//centerOfMass
GameObject centerOfmassOBJ = new GameObject("centerOfmass");
centerOfmassOBJ.transform.parent = transform;
centerOfmassOBJ.transform.localPosition = new Vector3(0.0f, -0.3f, 0.0f);
ms_Rigidbody.centerOfMass = transform.InverseTransformPoint(centerOfmassOBJ.transform.position);
//
BoxCollider collider = GetComponent<BoxCollider>();
collider.size = new Vector3(0.5f, 1.0f, 3.0f);
//
GenerateWheels();
}
void OnEnable()
{
WheelCollider WheelColliders = GetComponentInChildren<WheelCollider>();
WheelColliders.ConfigureVehicleSubsteps(1000, 30, 30);
}
void FixedUpdate()
{
horizontalInput = Input.GetAxis("Horizontal");
verticalInput = Input.GetAxis("Vertical");
medRPM = (frontWheel.rpm + rearWheel.rpm) / 2;
rbVelocityMagnitude = ms_Rigidbody.velocity.magnitude;
//motorTorque
if (medRPM > 0)
{
rearWheel.motorTorque = verticalInput * ms_Rigidbody.mass * 4.0f;
}
else
{
rearWheel.motorTorque = verticalInput * ms_Rigidbody.mass * 1.5f;
}
//steerAngle
float nextAngle = horizontalInput * 35.0f;
frontWheel.steerAngle = Mathf.Lerp(frontWheel.steerAngle, nextAngle, 0.125f);
if (Mathf.Abs(rearWheel.rpm) > 10000)
{
rearWheel.motorTorque = 0.0f;
rearWheel.brakeTorque = ms_Rigidbody.mass * 5;
}
//
if (rbVelocityMagnitude < 1.0f && Mathf.Abs(verticalInput) < 0.1f)
{
rearWheel.brakeTorque = frontWheel.brakeTorque = ms_Rigidbody.mass * 2.0f;
}
else
{
rearWheel.brakeTorque = frontWheel.brakeTorque = 0.0f;
}
//
Stabilizer();
}
void Update()
{
//update wheel meshes
Vector3 temporaryVector;
Quaternion temporaryQuaternion;
//
frontWheel.GetWorldPose(out temporaryVector, out temporaryQuaternion);
meshFront.transform.position = temporaryVector;
meshFront.transform.rotation = temporaryQuaternion;
//
rearWheel.GetWorldPose(out temporaryVector, out temporaryQuaternion);
meshRear.transform.position = temporaryVector;
meshRear.transform.rotation = temporaryQuaternion;
}
void Stabilizer()
{
Vector3 axisFromRotate = Vector3.Cross(transform.up, Vector3.up);
Vector3 torqueForce = axisFromRotate.normalized * axisFromRotate.magnitude * 50;
torqueForce.x = torqueForce.x * 0.4f;
torqueForce -= ms_Rigidbody.angularVelocity;
ms_Rigidbody.AddTorque(torqueForce * ms_Rigidbody.mass * 0.02f, ForceMode.Impulse);
float rpmSign = Mathf.Sign(medRPM) * 0.02f;
if (rbVelocityMagnitude > 1.0f && frontWheel.isGrounded && rearWheel.isGrounded)
{
ms_Rigidbody.angularVelocity += new Vector3(0, horizontalInput * rpmSign, 0);
}
}
void GenerateWheels()
{
GameObject frontWeelObject = new GameObject("frontWheel");
frontWeelObject.transform.parent = transform;
frontWeelObject.transform.localPosition = new Vector3(0, -0.5f, 1.0f);
frontWheel = frontWeelObject.gameObject.AddComponent<WheelCollider>() as WheelCollider;
//
GameObject rearWheelObject = new GameObject("rearWheel");
rearWheelObject.transform.parent = transform;
rearWheelObject.transform.localPosition = new Vector3(0, -0.5f, -1.0f);
rearWheel = rearWheelObject.gameObject.AddComponent<WheelCollider>() as WheelCollider;
//settings
frontWheel.mass = rearWheel.mass = 40;
frontWheel.radius = rearWheel.radius = 0.5f;
frontWheel.wheelDampingRate = rearWheel.wheelDampingRate = 0.75f;
frontWheel.suspensionDistance = rearWheel.suspensionDistance = 0.35f;
frontWheel.forceAppPointDistance = rearWheel.forceAppPointDistance = 0;
//spring
JointSpring suspensionSpringg = new JointSpring();
suspensionSpringg.spring = 15000;
suspensionSpringg.damper = 4000;
suspensionSpringg.targetPosition = 0.5f;
frontWheel.suspensionSpring = rearWheel.suspensionSpring = suspensionSpringg;
//Friction
WheelFrictionCurve wheelFrictionCurveFW = new WheelFrictionCurve(); //friction FW
wheelFrictionCurveFW.extremumSlip = 2.0f;
wheelFrictionCurveFW.extremumValue = 4.0f;
wheelFrictionCurveFW.asymptoteSlip = 4.0f;
wheelFrictionCurveFW.asymptoteValue = 2.0f;
wheelFrictionCurveFW.stiffness = 2.0f;
frontWheel.forwardFriction = rearWheel.forwardFriction = wheelFrictionCurveFW;
WheelFrictionCurve wheelFrictionCurveSW = new WheelFrictionCurve(); //friction SW
wheelFrictionCurveSW.extremumSlip = 0.2f;
wheelFrictionCurveSW.extremumValue = 1.0f;
wheelFrictionCurveSW.asymptoteSlip = 0.5f;
wheelFrictionCurveSW.asymptoteValue = 0.75f;
wheelFrictionCurveSW.stiffness = 2.0f;
frontWheel.sidewaysFriction = rearWheel.sidewaysFriction = wheelFrictionCurveSW;
//generateMeshes
GameObject wheelFrontMesh = new GameObject("wheelFrontMesh");
GameObject meshFrontTemp = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
Destroy(meshFrontTemp.GetComponent<CapsuleCollider>());
meshFrontTemp.transform.parent = wheelFrontMesh.transform;
meshFrontTemp.transform.localPosition = new Vector3(0.0f, 0.0f, 0.0f);
meshFrontTemp.transform.localEulerAngles = new Vector3(0.0f, 0.0f, 90.0f);
meshFrontTemp.transform.localScale = new Vector3(1.0f, 0.1f, 1.0f);
meshFront = wheelFrontMesh;
meshFront.transform.parent = transform;
meshFront.transform.localPosition = new Vector3(0, -0.5f, 1.0f);
//
GameObject wheelRearMesh = new GameObject("wheelRearMesh");
GameObject meshRearTemp = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
Destroy(meshRearTemp.GetComponent<CapsuleCollider>());
meshRearTemp.transform.parent = wheelRearMesh.transform;
meshRearTemp.transform.localPosition = new Vector3(0.0f, 0.0f, 0.0f);
meshRearTemp.transform.localEulerAngles = new Vector3(0.0f, 0.0f, 90.0f);
meshRearTemp.transform.localScale = new Vector3(1.0f, 0.1f, 1.0f);
meshRear = wheelRearMesh;
meshRear.transform.parent = transform;
meshRear.transform.localPosition = new Vector3(0, -0.5f, -1.0f);
//
GameObject meshCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
Destroy(meshCube.GetComponent<BoxCollider>());
meshCube.transform.parent = transform;
meshCube.transform.localPosition = new Vector3(0.0f, 0.0f, 0.0f);
meshCube.transform.localScale = new Vector3(0.5f, 1.0f, 3.0f);
}
}
esse 2° foram as temtativas de estabilisar a moto no eixo Z, tem que usar ele jumto com o codigo do carro,
EstabilisarMoto
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EstabilisarMoto : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
GetComponent<Rigidbody>().centerOfMass += new Vector3(0, -0.3f, -0.3f);
}
// Update is called once per frame
void Update()
{
// Quaternion estabi = Quaternion.Euler(transform.rotation.x, transform.rotation.y, 0);
http://transform.rotation = estabi;
http://transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, 0);
// transform.rotation = Quaternion.Euler(new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0));
if (Vector3.Angle(Vector3.up, transform.up) < 5)
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, transform.rotation.eulerAngles.y, 0), Time.deltaTime * 5);
}
}
}
Esse 3° é o codigo do carrto, no lugar de 4 rodas vc pode colocar só 2 não imprementei ainda, tem o turorial do marcos nesse link
https://www.youtube.com/watch?v=SAD5ph3Az88
- Código:
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Rigidbody))]
public class VeiculoSimples : MonoBehaviour
{
public Transform[] MeshRodas;
public WheelCollider[] ColisorRodas;
public float torque = 1000, pesoVeiculo = 1500, DirecaoAnguloMax = 40;
private float angulo, direcao;
private Rigidbody corpoRigido;
void Start()
{
corpoRigido = GetComponent<Rigidbody>();
corpoRigido.mass = pesoVeiculo;
}
void Update()
{
direcao = Input.GetAxis("Horizontal");
if (Input.GetAxis("Horizontal") > 0.7f || Input.GetAxis("Horizontal") < -0.7f)
{
angulo = Mathf.Lerp(angulo, direcao, Time.deltaTime* 50);
}
else
{
angulo = Mathf.Lerp(angulo, direcao, Time.deltaTime * 50);
}
if (Input.GetButton("Jump")){
ColisorRodas[2].brakeTorque = 4000;
ColisorRodas[3].brakeTorque = 4000;
}
else
{
ColisorRodas[2].brakeTorque = 0;
ColisorRodas[3].brakeTorque = 0;
}
}
void FixedUpdate()
{
ColisorRodas[0].steerAngle = angulo * DirecaoAnguloMax;
ColisorRodas[1].steerAngle = angulo * DirecaoAnguloMax;
//
ColisorRodas[2].motorTorque = Input.GetAxis("Vertical") * torque;
ColisorRodas[3].motorTorque = Input.GetAxis("Vertical") * torque;
for (int x = 0; x < ColisorRodas.Length; x++)
{
Quaternion quat;
Vector3 pos;
ColisorRodas[x].GetWorldPose(out pos, out quat);
MeshRodas[x].position = pos;
MeshRodas[x].rotation = quat;
}
}
}
Yuri Heinz- Avançado
- PONTOS : 3616
REPUTAÇÃO : 38
Idade : 28
Respeito as regras :
Re: sistema de motocicleta
se alguem souber um modo de manter zerado o eixo Z como eu estou temtando no 2 codico
por favor me avisem. grato
por favor me avisem. grato
Yuri Heinz- Avançado
- PONTOS : 3616
REPUTAÇÃO : 38
Idade : 28
Respeito as regras :
Tópicos semelhantes
» 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
» Posso usar o sistema de marcas de derrapagem como base para outro sistema?
» Como fazer Sistema Dia e Noite Segui o sistema de Hora
» Qual o melhor sistema sistema de anuncios para android?
» como fazer sistema de partículas apagar outro sistema de partículas
» Posso usar o sistema de marcas de derrapagem como base para outro sistema?
» Como fazer Sistema Dia e Noite Segui o sistema de Hora
» Qual o melhor sistema sistema de anuncios para android?
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos