
1.让马可以跳跃 (1.测试,如果我给马的刚体一个(1,1)的力代表跳跃,是否可行? Good Job!通过测试,可以通过给力的方式使马整体起飞,而且控制点和马蹄都会随之起飞,是理想的状态。 (2.让马并拢每一组腿,当按住某键,使该组腿并拢,也就是消除输入偏差。当松开键,重新设置输入偏差,使双腿分开。 DONE (3.从输入中获取信息,当两腿均并拢,进入跳跃模式,否则离开跳跃模式,在跳跃模式下,如何通过输入计算出应该给出多大、哪个方向的的跳跃力是核心和难点 (4.马脚和马脚的控制点很难控制,数据也经常抖动,我不想通过这两个变量来计算跳跃的力。我打算直接通过输入值判断 (5.尝试:首先,若处于跳跃模式,每帧记录上一帧输入,并计算一个瞬时速度,当瞬时速度的y大于0,也就代表此时腿在上升,在预备,不考虑。若瞬时速度的y小于0,说明腿开始下降,可能会跳起。此时判断此瞬时速度的模长是否大于某个阈值,若是,进入戒备状态,此后的若干帧后,有任何一帧再低于阈值,说明输入结束,输出最后的速度,并给予马刚体。若此时瞬时速度的模长小于阈值 ,说明太慢,不记录。在这个戒备状态中的每一帧,需要记录瞬时速度,并累计影响,最终经过乘以调整值、取反(因为是相对作用)操作,得到需要赋予马的力,然后把力赋给马刚体,完成一次跳跃 (6.Good!初步尝试有效。在马着地后,重置跳跃状态,即可完成循环,开始下一次跳跃。 至此,马基本可以跳跃,但是手感极差,并且键鼠几乎没有操作空间,需要后续进一步优化……
50 lines
1.8 KiB
C#
50 lines
1.8 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEngine.InputSystem;
|
|
|
|
/// <summary>
|
|
/// 玩家类,代表屏幕外的玩家,用来处理输入、传达信息、记录状态
|
|
/// </summary>
|
|
public class Player : MonoBehaviour
|
|
{
|
|
private PlayerC playerC;
|
|
private Horse horse;
|
|
|
|
void Start()
|
|
{
|
|
//找到必要的物体和组件
|
|
FindSth();
|
|
//绑定输入
|
|
InputBinding();
|
|
}
|
|
|
|
private void FindSth()
|
|
{
|
|
try{
|
|
horse = transform.Find("马").GetComponent<Horse>();
|
|
}catch(System.Exception) {Debug.LogError("要么子物体中没有马、要么马的名字不是马、要么马身上没有Horse组件");}
|
|
|
|
}
|
|
|
|
private void InputBinding()
|
|
{
|
|
//新建了一个操控类的实例,小心多个操控类实例的坑!这个东西不会自动销毁
|
|
playerC = new PlayerC();
|
|
//绑定基本移动相关的事件
|
|
playerC.GamePlay.MoveFrontFoot.performed += ctx => horse.SetInputFrontVector(ctx.ReadValue<Vector2>());
|
|
playerC.GamePlay.MoveBackFoot.performed += ctx => horse.SetInputBackVector(ctx.ReadValue<Vector2>());
|
|
playerC.GamePlay.MoveFrontFoot.canceled += ctx => horse.SetInputFrontVector(Vector2.zero);
|
|
playerC.GamePlay.MoveBackFoot.canceled += ctx => horse.SetInputBackVector(Vector2.zero);
|
|
//绑定并拢腿的相关事件
|
|
playerC.GamePlay.MergeBackFoot.started += ctx => horse.MergeFoot(Horse.FootType.Back);
|
|
playerC.GamePlay.MergeBackFoot.canceled += ctx => horse.RecoverFoot(Horse.FootType.Back);
|
|
playerC.GamePlay.MergeFrontFoot.started += ctx => horse.MergeFoot(Horse.FootType.Front);
|
|
playerC.GamePlay.MergeFrontFoot.canceled += ctx => horse.RecoverFoot(Horse.FootType.Front);
|
|
|
|
|
|
playerC.GamePlay.Enable();
|
|
}
|
|
|
|
}
|