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);
}
文章目录
关闭
共有 0 条评论