前文:https://blog.csdn.net/Jaihk662/article/details/86757037(Rigidbody物理类组件)

https://blog.csdn.net/Jaihk662/article/details/86759460(碰撞体)

PS:注释和讲解部分在代码中

一、给物体添加力

两个方法:

Rigidbody.AddForce(Vector3,ForceMode):给刚体添加一个力,让刚体按世界坐标系进行运动

Rigidbody.AddRelativeForce(Vector3,ForceMode):给刚体添加一个力,让刚体按自身坐标系进行运动

注意:物体运动过程中自身坐标系可能随时发生改变(例如球滚动),这就意味着按自身坐标系运动方向可能会随时发生变化

Vector3:力的向量,ForceMode:力的模式(枚举类)

四种力的模式(Ft=mv):

  1. ForceMode.Force:给物体一个持续的力
  2. ForceMode.Acceleration:给物体一个持续的加速度,但是忽略其质量,质量被默认为1
  3. ForceMode.Impulse:给物体添加一个瞬间的力
  4. ForceMode.VelocityChange:给物体添加一个瞬间的加速度,忽略其质量
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Text1: MonoBehaviour
{
    //因为Start()只会在开始游戏时被执行一次,所以一般都用来初始化
    private Transform myTransform;      //实例化Transform对象
    private Rigidbody myRigidbody;
    void Start()
    {
        Debug.Log("Start");     //输出调试
        myTransform = gameObject.GetComponent<Transform>();        //获取相应对象的引用
        myRigidbody = gameObject.GetComponent<Rigidbody>();
    }
    // Update is called once per frame
    void Update()
    {
        if(Input.GetMouseButtonDown(1))
            myRigidbody.AddForce(new Vector3(0, 0, -3), ForceMode.Impulse);
        if(Input.GetMouseButton(0))
            myRigidbody.AddForce(new Vector3(0, 0, -10), ForceMode.Force);      //如果动不了,可能是力量太小,需要调整向量参数
    }
}

 

二、FixedUpdate()固定更新方法

要知道正常游戏1帧=1次动画渲染,当你显卡不行,那么1秒可能只有20帧,如果追求极致,1秒可以144帧,也就是每帧不固定,这个时候就需要固定刷新时间/方法调用时间。特别是:在Update()方法中执行物理操作,会出现卡顿的情况

这样,所有和物理相关的操作,代码都要写在 FixedUpdate() 方法体内

FixedUpdate() 的固定更新的时间间隔是0.02秒,也就是1秒执行50次。

手动设置方法:Edit→Project Settings→Time面板,里面的Fixed Timestep参数即是时间间隔

正确代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Text1: MonoBehaviour
{
    //因为Start()只会在开始游戏时被执行一次,所以一般都用来初始化
    private Transform myTransform;      //实例化Transform对象
    private Rigidbody myRigidbody;
    void Start()
    {
        Debug.Log("Start");     //输出调试
        myTransform = gameObject.GetComponent<Transform>();        //获取相应对象的引用
        myRigidbody = gameObject.GetComponent<Rigidbody>();
    }
    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            Debug.Log("刚体向前移动");
            myRigidbody.MovePosition(myTransform.position + (new Vector3(0, 0, 1)));
        }
        if (Input.GetKeyDown(KeyCode.A))
        {
            Debug.Log("刚体向左移动");
            myRigidbody.MovePosition(myTransform.position + (new Vector3(-1, 0, 0)));
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            Debug.Log("刚体向后移动");
            myRigidbody.MovePosition(myTransform.position + (new Vector3(0, 0, -1)));
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            Debug.Log("刚体向右移动");
            myRigidbody.MovePosition(myTransform.position + (new Vector3(1, 0, 0)));
        }
    }
    void FixedUpdate()
    {
        if (Input.GetMouseButtonDown(1))            //按下鼠标右键
            myRigidbody.AddForce(new Vector3(0, 0, -3), ForceMode.Impulse);
        if (Input.GetMouseButton(0))                //压住鼠标左键
            myRigidbody.AddForce(new Vector3(0, 0, -10), ForceMode.Force);
    }
}

效果如下:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐