当前位置: 首页 > 工具软件 > ruby2d > 使用案例 >

【unity learn】【Ruby2D】控制人物运动的两套模式

公西星海
2023-12-01

第一种,采用更加现实的模式进行运动,代码里含有加速度和速度,以及摩擦力,在人物开始运动时会有一定延迟(毕竟要先加速嘛),优点时贴合实际,这套模式可采用到赛车游戏等需要加速的游戏中。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MyRubyController : MonoBehaviour
{
    [SerializeField]
    //将加速度暴露出来使其可调
    private float _accel = 0.1f;//加速度
    [SerializeField]
    public float _maxSpeed = 5f;//maxSpeed:对速度进行限制
    // Start is called before the first frame update
    Rigidbody2D rb2d;//声明刚体组件
    //获取用户输入
    float horizontal;//获取水平键盘输入
    float vertical;//获取垂直键盘输入
    public float friction = 1f;//摩擦力
    void Start()
    {
        //获取当前游戏对象的刚体组件
        rb2d = GetComponent<Rigidbody2D>();
    }
    // Update is called once per frame
    void Update()
    {
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
        float dt = Time.deltaTime;//时间
        ApplyFriction(dt);
        ApplyMovement(dt);
    }
    private void ApplyMovement(float dt)
    {
        Vector2 accel = new Vector2(horizontal * this._accel, vertical * this._accel);//建立一个加速度向量
        Vector2 vel = rb2d.velocity;//建立一个向量获取当前刚体组件的速度
        vel += accel * dt;//每一帧速度加等于加速度
        float velSize = vel.magnitude;//向量长度
        if (velSize > _maxSpeed)//大于最大速度时置为最大速度
        {
            vel = vel.normalized * _maxSpeed;
        }
        rb2d.velocity = vel;//将修改过的值返回该速度
    }

    private void ApplyFriction(float dt)
    {
        float faccel = friction; //摩擦力加速度
        Vector2 vel = rb2d.velocity; // 人物速度
        vel = Vector2.MoveTowards(vel, Vector2.zero, faccel * dt);//向zero靠近,慢慢减速
        rb2d.velocity = vel;
    }
}

第二套是立刻启动,因为原理是直接修改Rigidbody的position属性,不过这一套我们也要添加摩擦力系统,不然的话我们如果被带有速度的刚体撞击的话会停不下来。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RubyController1 : MonoBehaviour
{
    //将速度暴露出来使其可调
    public float speed = 0.1f;
    int currentHealth;//生命值
    // Start is called before the first frame update
    Rigidbody2D rb2d;//声明刚体组件
    //获取用户输入
    float horizontal;//获取水平键盘输入
    float vertical;//获取垂直键盘输入
    public float friction = 1f;//摩擦力
    void Start()
    {
        //获取当前游戏对象的刚体组件
        rb2d = GetComponent<Rigidbody2D>();
        currentHealth = maxHealth;
    }
    // Update is called once per frame
    void Update()
    {

    }
    private void FixedUpdate()
    {
        horizontal = Input.GetAxis("Horizontal");
        vertical = Input.GetAxis("Vertical");
        Vector2 position = rb2d.position;//tranform组件,该节点tranform修改x和y
        position.x = position.x + speed * horizontal * Time.deltaTime;
        position.y = position.y + speed * vertical * Time.deltaTime;//Time.deltaTime:时间帧率。
        rb2d.position = position;
        float dt = Time.deltaTime;//时间
        ApplyFriction(dt);
    }



    private void ApplyFriction(float dt)
    {
        float faccel = friction; //摩擦力加速度
        Vector2 vel = rb2d.velocity; // 人物速度
        vel = Vector2.MoveTowards(vel, Vector2.zero, faccel * dt);//向zero靠近
        rb2d.velocity = vel;
        //float velSize = vel.magnitude;
        //float accelSize = faccel * dt;
        //if (accelSize >= velSize)
        //{
        //    vel = Vector2.zero;
        //}
        //else
        //{
        //    vel -= vel.normalized * accelSize;
        //}
    }
}

Ruby

 类似资料: