Добавлен Hotspur
Привет, подскажите пожалуйста как делают "правильно" физику столкновений в этом движке. Столкнулся с несколькими проблемами:
Вот есть у меня герой с двумя коллайдерами. один (круглый) с трением 1 для ног, второй (прямоугольный) с трением 0 чтоб не лип к стенам, когда прыгаешь в их сторону.
Так вот из-за того что у прямоугольного коллайдера стоит трение 0, то когда герой вбегает по наклонной поверхности (у поверхности трение 1, использовал материал как у ног героя) к стене, то он взлетает вверх и выглядит это ужасно :(
Была идея, что проблема с моим movementController'ом, потому что он позволяет двигаться в прыжке и из-за того герой липнет к стенам если трение 1 у прямоугольного коллайдера, но ведь почти во всех аналогичных играх можно двигаться в прыжке.
И еще одна проблема, что когда герой встает на наклонную поверхность, то съезжает с нее как лыжник, что тоже выглядит неправильно для таких игр (если поверхность не из льда).
MovementController.cs
смотреть сюда
public class MovementController : MonoBehaviour {
[HideInInspector]
public bool FacingRight = true;
[HideInInspector]
public bool Jump = false;
public float MoveForce = 365f;
public float MaxSpeed = 5f;
public float JumpForce = 1000f;
public Transform GroundCheck;
private bool grounded = false;
private Animator anim;
private Rigidbody2D rb2d;
void Awake()
{
anim = GetComponent<Animator>();
rb2d = GetComponent<Rigidbody2D>();
}
void Update()
{
grounded = Physics2D.Linecast(transform.position, GroundCheck.position, 1 << LayerMask.NameToLayer("Ground"));
if (Input.GetButtonDown("Jump") && grounded)
{
Jump = true;
}
}
void FixedUpdate()
{
float h = Input.GetAxis("Horizontal");
anim.SetFloat("Speed", Mathf.Abs(h));
if (h * rb2d.velocity.x < MaxSpeed)
{
rb2d.AddForce(Vector2.right * h * MoveForce);
}
if (Mathf.Abs(rb2d.velocity.x) > MaxSpeed)
{
rb2d.velocity = new Vector2(Mathf.Sign(rb2d.velocity.x) * MaxSpeed, rb2d.velocity.y);
}
if (h > 0 && !FacingRight)
{
Flip();
}
else if (h < 0 && FacingRight)
{
Flip();
}
if (Jump)
{
anim.SetTrigger("Jump");
rb2d.AddForce(new Vector2(0f, JumpForce));
Jump = false;
}
}
void Flip()
{
FacingRight = !FacingRight;
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
}
Принятый ответ
А что если пойти от обратного, т.е. у персонажа оставить только 1 коллайдер, а вот с землей и со стенами поэсперементировать:
- Земле сделать трение 1
- Стенам сделать трение 2
Почему персонаж липнет к стене: потому что для движения прикладывается сила и когда персонаж упирается в стену, то его силой придавливает к ней и соответственно возникает трение.
На счет скатывание как лыжник: тут советую наклонять персонажа для эстетической красоты) А вообще если сделать как я предложил в самом начале, то такой эффект пропадет.
То что я предложил возможно не правильно, но мне кажется, что это должно решить данную проблему.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Jusper
Отредактирован alexprey
JumpForce = 0,03f;