製作過程
在場景中新建一個球體(Planet)和一個膠囊(Player),適當縮放並新增材質,這裡膠囊會被視為玩家
然後將攝像機設為膠囊(Player)的子物體
自行調整合適的攝像機視角
新建指令碼GravityArrtacter
,新增到Planet上
public class GravityAttracter : MonoBehaviour
{
public float gravity = -10; //重力大小
public void Attract(GameObject obj) //吸引物體的方法,傳入需要吸引的物體
{
Transform body = obj.GetComponent<Transform>();
Vector3 gravityUp = (body.position - transform.position).normalized; //星球到玩家的向量
Vector3 bodyUp = body.up; //被吸引物體的正上方向
body.GetComponent<Rigidbody>().AddForce(gravityUp * gravity);//吸引物體,重力大小為負數,方向變為物體到星球方向
//讓一個軸從引數一的方向旋轉到引數二(世界空間)的方向,這裡是讓物體上方旋轉到重力方向,
//但是一個軸無法決定物體的旋轉狀態,* body.rotation得到物體需要旋轉的目標方向
Quaternion targetRotation = Quaternion.FromToRotation(bodyUp, gravityUp) * body.rotation;
//進行插值,旋轉
body.rotation = Quaternion.Slerp(body.rotation, targetRotation, 50 * Time.deltaTime);
}
}
自己設定重力大小,這裡負數表示重力方向
新建指令碼Body
,新增到Player上
public class Body : MonoBehaviour
{
public FauxGravityAttracter attracter; //宣告星球重力
private Rigidbody myRigidbody;
void Start()
{
myRigidbody = gameObject.GetComponent<Rigidbody>(); //獲取物體剛體
myRigidbody.constraints = RigidbodyConstraints.FreezeRotation;//取消剛體碰撞旋轉影響
myRigidbody.useGravity = false; //取消世界空間重力影響
}
void Update()
{
attracter.Attract(gameObject);//傳入引數,該物體被吸引
}
}
設定對應引數
新建PlayerController
,新增到Player上
public class PlayerController : MonoBehaviour
{
public float moveSpeed = 15f;
private Vector3 moveDir;
private Rigidbody myRigidbody;
void Start()
{
myRigidbody = gameObject.GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
myRigidbody.MovePosition(myRigidbody.position + transform.TransformDirection(moveDir) * moveSpeed * Time.deltaTime);
}
void Update()
{
moveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")).normalized;
}
}
設定移動速度
這樣就模擬出在星球表面行走