Простое движение на основе ускорения в UnityC#

Место общения программистов C#
Ответить
Anonymous
 Простое движение на основе ускорения в Unity

Сообщение Anonymous »

Я новичок в Unity и хотел создать простую систему движения на основе ускорения, которая имитирует движение фигуриста на катке, где игрок использует ввод с клавиатуры, чтобы изменить направление своего движения и ускориться. Но по какой-то причине этот код не работает, хотя идея была очень простой.

Код: Выделить всё

using System;
using UnityEngine;

public class Movement : MonoBehaviour
{
private float _mouseSensitivity = 3f;
private float velocity = 0;
private double vangle = 0; //velocity vector angle
private float fangle = 0; //angle player is facing
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{

}
Vector2 Avector(float angle) { //generate a vector2 with magnitude 1 pointing in the angle direction
float rad = (float)Math.PI/180;
Vector2 v = new Vector2((float)Math.Sin(angle*rad),(float)Math.Cos(angle*rad));
return v;
}
// Update is called once per frame
void Update()
{
float rad = (float)Math.PI/180;
float timeDelta = Time.deltaTime;
//decceleration by 1/sec
if (velocity < timeDelta) {
velocity = 0;
} else {
velocity -= timeDelta;
}
float z = 0;
float x = 0;
//keyboard input
if (Input.GetKey(KeyCode.W)) z += 1f;
if (Input.GetKey(KeyCode.S)) z -= 1f;
if (Input.GetKey(KeyCode.D)) x += 1f;
if (Input.GetKey(KeyCode.A)) x -= 1f;
Vector2 v = new Vector2(velocity*(float)Math.Sin(vangle*rad),velocity*(float)Math.Cos(vangle*rad));
Vector2 v1 = 4*z*Avector(fangle);//accelerate by 4/s^2
Vector2 v0 = 4*x*Avector(fangle+90);
v+=(v1+v0)*timeDelta;//update velocity vector
velocity = v.magnitude;
vangle = Math.Atan2(v.y,v.x)*180/Math.PI;
if (velocity > 8) { //cap velocity at 8
float scale = 8f/velocity;
v.x*=scale;
v.y*=scale;
velocity = 8f;
}
Vector3 move = new Vector3(v.x, 0, v.y);
transform.position+=move*timeDelta; //move player
float mouseX = Input.GetAxis("Mouse X") * _mouseSensitivity;
fangle += mouseX;
transform.localEulerAngles+=new Vector3(0,mouseX,0);
}
}
Проблема возникает, когда я пытаюсь двигаться: кажется, что вектор скорости не обновляется должным образом, а направление, связанное с каждой клавишей, не совпадает с локальной осью координат. Это может быть следствием основной проблемы, но изменение направления вектора скорости также не является плавным, изменение направления происходит только тогда, когда скорость приближается к 0. Я не знаю, проблема ли это с моей стороны или просто ошибка в работе движения в Unity.

Подробнее здесь: https://stackoverflow.com/questions/792 ... t-in-unity
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»