Unity记录6.3-动作-控制系统优化

汇总:Unity 记录
开源地址:asd123pwj/asdGame

摘要:使用委托及行为,对控制系统优化。

不错的地面技巧-2023/10/01

  • 角色的质量、重力、自身或接触面的摩擦系数,均为1时可以在地面上滑,且跳跃落地一瞬间速度能从10归零。
  • 摩擦系数小于1时,才可能跳跃落地后,保持一定速度。
  • 因为之前不论怎么调摩擦系数,移动都有问题,所以都没想到落地速度归零是摩擦力太大的原因。记录一下。

控制-2023/10/01

  • 最开始的角色控制很朴素,写死在脚本里。
    • 即很多新手教程那样,用Input.GetAxis()设置rb.velocity
  • 然后,写了一个控制脚本,调用对象的控制函数。
  • 之后,在生成角色的时候,设置控制脚本的控制对象,更灵活的切换角色。
  • 这次,实现一个行为注册,角色生成时,根据tags来为控制脚本注册控制行为。
    • 大致的变化可以描述如下。
// if (Input.GetAxisRaw("Horizontal") != 0){
//     _control_system._player.GetComponent<ObjectIndividual>()._horizontal(Input.GetAxis("Horizontal"));
// }
// if (Input.GetAxisRaw("Vertical") != 0){
//     _control_system._player.GetComponent<ObjectIndividual>()._vertical(Input.GetAxis("Vertical"));
// }

->

if (Input.GetAxisRaw("Horizontal") != 0) action("horizontal");
if (Input.GetAxisRaw("Vertical") != 0) action("vertical");

行为初始化-2023/10/01

  • 初始化的流程如下
    • 定义一个用于保存输入的结构体InputInfo,以实现所有行为共用一个传参类型,进而方便委托函数的实现
    • 定义一个委托函数_new_action(),委托函数的传参即InputInfo结构体。
    • 创建一个字典_input2Actions,用来指示不同输入下的行为列表。
    • 定义一个注册函数,用于为行为列表增加行为,行为的类型为之前定义的委托函数。
    • 注册函数内,像常规方式一样对待待增加的行为。
  • 一个简化的代码如下
public struct InputInfo{
    public float horizontal;
}

public delegate void _new_action(InputInfo info);

public class InputAction{
    // ---------- events ----------
    public Dictionary<string, List<_new_action>> _input2Actions = new();

    public InputAction(){
        init_input2Actions();
    }

    public void _register_action(string input_type, _new_action action, bool isNew=false){
        _input2Actions[input_type].Add(action);
    }

    void init_input2Actions(){
        // ---------- mouse events ----------
        _input2Actions.Add("horizontal", new());
    }
}

调用行为-2023/10/01

  • 循环执行行为列表即可。
void update_input_info(){
    _input_info.horizontal = Input.GetAxis("Horizontal");
}

void action(string input_type){
    var actions = _InputAction._input2Actions[input_type];
    foreach (var action in actions){
        action(_input_info);
    }
}

void FixedUpdate(){
    update_input_info();
    if (Input.GetAxisRaw("Horizontal") != 0) action("horizontal");

行为注册-2023/10/01

  • 将一个参数与委托相同的函数,函数名作为参数传入注册函数即可。
    • 注册函数见前面的行为初始化。
void register_input_action(){
    _Config._InputBase._register_action("horizontal", _horizontal, true);
}

public void _horizontal(InputInfo input_info){
    Vector2 velocity = new (input_info.horizontal, 0);
    _Config._Move._move(velocity.normalized, velocity.magnitude * _Config._magnitude_move_speed.x);
}

版权声明:
作者:MWHLS
链接:https://mwhls.top/4926.html
来源:无镣之涯
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>
文章目录
关闭
目 录