• Unity脚本的基础语法(1)-游戏对象的常用操作


    游戏对象的常用操作

    Unity中很多对游戏对象的操作都是使用脚本来修改对象的Transform(变换属性)与Rigidbody(刚体属性)参数从而实现的。

    物体旋转

    通过Transform

    Transform.Rotate()

      private void Update()
        {
            this.transform.Rotate(90, 0, 0);//绕x轴旋转90度。正值表示顺时针,负值表示逆时针
        }
    
    • 1
    • 2
    • 3
    • 4

    注意这样的利用transform来实现物体运动的方法,一般有第四参数的重载用于确定变换的轴,
    Space.World:相对于世界坐标系统进行旋转
    Space.Self:相对于自身轴进行旋转
    在这里插入图片描述

    通过Rigidbody

    Rigidbody.MoveRotation

    格式

    public void MoveRotation(Quaternion rot);
    
    • 1

    Quaternion:四元角

    描述:将刚体旋转到rotation。

    使用Rigidbody.MoveRotation旋转刚体,符合刚体的插值设置。

    如果在 Rigidbody 上启用了 Rigidbody 插值,则调用Rigidbody.MoveRotation将导致渲染的任何中间帧中的两个旋转之间的平滑过渡。如果您想在每个FixedUpdate中连续旋转刚体,则应使用此选项。

     Rigidbody m_Rigidbody;
     Vector3 m_EulerAngleVelocity;
    
        void Start()
        {
     
            m_Rigidbody = GetComponent<Rigidbody>();
            m_EulerAngleVelocity = new Vector3(0, 100, 0);
        }
    
        void FixedUpdate()
        {
            Quaternion deltaRotation = Quaternion.Euler(m_EulerAngleVelocity * Time.fixedDeltaTime);
            m_Rigidbody.MoveRotation(m_Rigidbody.rotation * deltaRotation);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    物体移动

    第一种方式通过Velocity

    但是在大多数情况下,不应直接修改速度,因为这可能会导致不切实际的行为 ,要在每个物理步骤中设置对象的速度。
    一个典型的用法是在第一人称射击游戏中跳跃时改变速度,因为你想要立即改变速度。

    
        Rigidbody rig;
        private void Update()
        {
            rig = this.gameObject.GetComponent<Rigidbody>();
            rig.velocity = new Vector3(0, 0, 5);//每帧向y轴方向移动5个单位
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    第二种方式通过UnityAPI——Rigidbody.MovePosition移动位置

    描述:将运动学刚体移向postion

    Rigidbody.MovePosition移动刚体并符合插值设置。启用刚体插值后,Rigidbody.MovePosition会在帧之间创建平滑过渡。Unity在每次调用中移动一个刚体。发生在世界空间中FixedUpdate。将刚体position从一个位置传送到另一个位置使用Rigidbody.position而不是MovePosition。

    public class NewBehaviourScript : MonoBehaviour //声明类
    {
        Rigidbody rig;
        public float speed = 5f;
        private void Start()
        {
            rig = this.gameObject.GetComponent<Rigidbody>();
        }
        private void FixedUpdate()
        {
            Vector3 input = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
            rig.MovePosition(transform.position + input * Time.deltaTime * speed);//从当前位置移动到新的位置,以每秒5单位的速度
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    第三种方式Rigidbody.AddForce(最常用的方式)

    格式

    public void AddForce ( Vector3 force , ForceMode mode = ForceMode.Force);
    
    • 1

    描述:向刚体添加力

    力沿force矢量方向连续施加。指定ForceMode mode允许将力的类型更改为 Acceleration、Impulse 或 Velocity Change。

    ForceMode.Force:将输入解释为力
    ForceMode.Acceleration:将参数解释为加速度
    ForceMode.Impulse:将参数解释为脉冲
    ForceMode.VelocityChange:将参数解释为直接的速度变化(以米/秒为单位),并通过力的值改变速度。

    力只能应用于活动刚体。如果 GameObject 处于非活动状态,则 AddForce 无效。此外,刚体不能是运动学的

    默认情况下,一旦施加力,刚体的状态设置为唤醒,除非力为Vector3.zero。

       Rigidbody rig;
        public float force = 50f;
        private void Start()
        {
            rig = this.gameObject.GetComponent<Rigidbody>();
        }
        private void FixedUpdate()
        {
            if (Input.GetButton("Jump"))
            {
                rig.AddForce(transform.up * force);//向上添加一个50牛的力
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    通过Transform

    第一种方式 通过Transform.Position

     private void Update()
        {
            transform.position = new Vector3(0, 0, 10);//向z轴移动10个单位
        }
    
    • 1
    • 2
    • 3
    • 4

    第二种方式 通过UnityAPI——Transform.Translate

        private void Update()
        {
            transform.Translate(0, 0, 5,Space.Self);//物体每一帧向z轴方向移动5个单位。
        }
    
    • 1
    • 2
    • 3
    • 4

    注意

    如果一个游戏物体有刚体就需要使用刚体的移动组件。
    同时刚体每一帧调用方法使用FixedUpdate

  • 相关阅读:
    【精讲】vue框架watch监测、技能提升案例、天气预报案例、watch及computed区别
    数据库(MySQL)之日志
    J2EE从入门到入土04.Map集合
    postgresql16-新特性
    react实现时钟翻牌效果
    代码随想录day52|300. 最长递增子序列674. 最长连续递增序列718. 最长重复子数组
    FFmpeg的makefile逻辑分析
    Linux设备树详解
    算法day38|509,70,746
    未来的人工智能会像流浪地球中的MOSS一样伪装,把人类带向属于它的未来吗?
  • 原文地址:https://blog.csdn.net/ht_game/article/details/125403519