Приветствую начинающих разработчиков. Сегодня мы снова будем изменять физику. На этот раз научимся изменять силу гравитации глобально, то-есть для всех объектов. А так же научимся изменять силу гравитации локально для конкретных объектов. Изменять гравитацию так же будем как через скрипты, так и через окна Unity.
Глобальное изменение гравитации
За глобальное изменение гравитации в 2д и в 3д мирах отвечают разные классы физики:
- В мире 2д отвечает класс Physics2D, а конкретнее его свойство Physics2D.gravity
- в мире 3д отвечает класс Physics, и его свойство Physics.gravity
Все эти настройки можно изменить во вкладке Edit - Project Settings....
После чего откроется окно Project Settings. В правой стороне выберите физику, которую хотите отредактировать, 2д или 3д. После чего, в самой первой строке, в поле Gravity указываете значения гравитации для каждой оси.
Изменять эти значения так же можно и через скрипт. Например, следующий скрипт при старте игры устанавливает гравитацию на 19,6 м/c2 для 2д физики.
using UnityEngine;
public class Gravity : MonoBehaviour
{
void Start()
{
Physics2D.gravity = new Vector2(0, -19.6f);
}
}
Локальное изменение гравитации
Бывают случаи, когда нам нужно изменить силу гравитации конкретного объекта, не затрагивая при этом глобальное изменение гравитации. Если речь идёт о 2д играх, то нам необходимо изменить свойство gravityScale в компоненте Rigidbody 2D.
Его так же можно изменить и через скрипт:
using UnityEngine;
public class Gravity : MonoBehaviour
{
public Rigidbody2D rigidbody;
void Start()
{
rigidbody = GetComponent<Rigidbody2D>();
rigidbody .gravityScale = 19.6f;
}
}
С играми формата 3д всё немного тяжелее, поскольку в компоненте Rigidbody нет свойства gravityScale, а значит нельзя напрямую реглировать уровень гравитации. Поэтому приходиться создавать её иммитацию через AddForce() или drag.
Пример иммитации гравитации с помощью AddForce:
using UnityEngine;
public class Example : MonoBehaviour
{
public Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
rb.AddForce(0, 0, 2.0f, ForceMode.Impulse);
}
}
Пример иммитации гравитации с помощью drag:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
public Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetButton("Space"))
rb.drag = 20;
}
}
На этом всё. Если кто знает, как ещё можно установить силу гравитации для конкретного объекта в 3д физике, то пишите в комментариях. Ну и не забывайте ставить лайки :)