Unity製作一個小星球

AlphaIcarus發表於2022-04-23

製作過程

在場景中新建一個球體(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;
    }
}

設定移動速度

這樣就模擬出在星球表面行走

相關文章