• Unity制作一个小星球


    制作过程

    在场景中新建一个球体(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;
        }
    }
    

    设置移动速度

    这样就模拟出在星球表面行走

  • 相关阅读:
    Android Studio 的android.jar文件在哪儿
    Verilog功能模块——同步FIFO
    软件测试行情不好,我还是啃下了27K的offer
    Mac 下安装PostgreSQL经验
    【无标题】
    HTML+CSS期末大作业 中国传统美食网站设计 节日美食13页 html5网页设计作业代码 html制作网页案例代码 html大作业网页代码
    JavaScript系列从入门到精通系列第三篇:JavaScript基本语法(一)
    Arduino驱动MAX31865读取铂电阻温度
    炫酷动漫游戏网站页面设计html页面前端源码
    centos6 升级glibc
  • 原文地址:https://www.cnblogs.com/AlphaIcarus/p/16183741.html