1.实现瞄准状态和接剑状态
准备好瞄准动画,投掷动画和接剑动画,并设置参数AimSword和CatchSword
投掷动画在瞄准动画后,瞄准结束后才能投掷

创建PlayerAimSwordState脚本和PlayerCatchSwordState脚本并在Player中初始化:
PlayerAimSwordState脚本:
if(Input.GetKeyDown(KeyCode.Mouse1))//鼠标右键
{
_PlayerStateMachine.ChangeState(_Player.idleState);
}//在Update中,用于调试
PlayerGroundedState脚本:
if(Input.GetKeyDown(KeyCode.Mouse1))
{
_PlayerStateMachine.ChangeState(_Player.AimSword);
}

为SkillManage对象创建新脚本Sword_Skil并在SkillManage脚本中初始化它:
**[Header("Skill info")]
SerializeField\] private GameObject swordPrefab;//剑的预制体
\[SerializeField\] private Vector2 lanchForce;//剑的发射方向
\[SerializeField\] private float swordGravity;//剑的重力改变**
## 2.实现剑的投掷(剑预制体的创建与代码调用)
创建剑的对象,你可以创建一个父对象和子对象来表示一把剑,子对象负责挂载动画组件,父对象负责挂载刚体碰撞器等。

为其添加旋转和待机动画,并添加rotation参数用来控制动画

### Skill脚本:
**protected Player player { get; private set; }//实例化Player,方便调用**
**protected virtual void Start()
{
player = PlayerManage.instance.player;
}**
### 为剑预制体添加Sword_Skill_Control脚本:
**private Animator anim;
private Rigidbody2D rb;
private CircleCollider2D cd;**
**private Player player;**
**private void Awake()
{
anim = GetComponent\
SerializeField\] private int numbersofDots;//生成点的数量 \[SerializeField\] private float spaceBetweenTwoDots;//每个点间隔的时间 \[SerializeField\] private GameObject dotPrefab;//点的预制体,自行创建,记得更改图层为地面 \[SerializeField\] private Transform dotsParent;//自行在玩家下创建一个子对象,作为生成所有点的父对象** **private GameObject\[\] dots;//生成点的数组** **private void GenerateDots()//生成所有点 { dots = new GameObject\[numbersofDots\]; for (int i = 0; i \< numbersofDots; i++) { dots\[i\]=Instantiate(dotPrefab,player.transform.position,Quaternion.identity,dotsParent); dots\[i\].SetActive(false); } }** **protected override void Start()//调用上述函数 { base.Start();** **GenerateDots(); }** **public void DotsActove(bool _isActive)//设置点是否可见 { for(int i = 0; i \< dots.Length; i++)//循环 { dots\[i\].SetActive(_isActive); } }** **private Vector2 DotsPosition(float t)//返回每个点的位置 { Vector2 position = (Vector2)player.transform.position + new Vector2(AnimDirection().normalized.x \* lanchForce.x, AnimDirection().y \* lanchForce.y) \* t + .5f \* (Physics2D.gravity \* swordGravity) \* (t \* t);** **//位置 = 初始位置 + 初速度 × 时间 + 0.5 × 加速度 × 时间²** **return position; }** **protected override void Update() { if(Input.GetKeyUp(KeyCode.Mouse1)) { finalDir = new Vector2(AnimDirection().normalized.x \*lanchForce.x,AnimDirection().y \*lanchForce.y); }** **if(Input.GetKey(KeyCode.Mouse1))//按住鼠标右键时时刻更新这些点的位置 { for(int i = 0; i \< dots.Length; i++) { dots\[i\].transform.position = DotsPosition(i \* spaceBetweenTwoDots); } } }** ### PlayerAimSwordState脚本: **public override void Enter() { base.Enter();** **SkillManage.instance.sword.DotsActove(true); }** **public override void Exit() { base.Exit();** **SkillManage.instance.sword.DotsActove(false); }//进入瞄准时可见这些点,退出消失** 演示: 