Sword_Skill_Controller.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Sword_Skill_Controller : MonoBehaviour
{
[SerializeField] private float returnSpeed = 12;
private bool isReturning;
private Animator anim;
private Rigidbody2D rb;
private CircleCollider2D cd;
private Player player;
private bool canRotate = true;
public float bounceSpeed;//设置弹跳速度
public bool isBouncing = true;//判断是否可以弹跳
public int amountOfBounce = 4;//弹跳的次数
public List<Transform> enemyTargets;//保存所有在剑范围内的敌人的列表
private int targetIndex;//设置targetIndex作为敌人计数器
private void Awake()
{
anim = GetComponentInChildren<Animator>();
rb = GetComponent<Rigidbody2D>();
cd = GetComponent<CircleCollider2D>();
}
public void ReturnSword()
{
rb.constraints = RigidbodyConstraints2D.FreezeAll;//修复剑只要不触碰到物体就无法收回的bug
//rb.isKinematic = false;
transform.parent = null;
isReturning = true;
}
public void SetupSword(Vector2 _dir,float _gravityScale,Player _player)
{
player = _player;
rb.velocity = _dir;
rb.gravityScale = _gravityScale;
anim.SetBool("Rotation", true);
}
private void Update()
{
if(canRotate)
transform.right = rb.velocity;//使武器随着速度而改变朝向
if (isReturning)
{
transform.position = Vector2.MoveTowards(transform.position, player.transform.position, returnSpeed * Time.deltaTime);//从原来的位置返回到player的位置
//并且随着时间增加而增加速度
if(Vector2.Distance(transform.position,player.transform.position)<1)//当剑与player的距离小于一定距离,清除剑
{
player.CatchTheSword();
}
}
if(isBouncing && enemyTargets.Count > 0)
{
transform.position = Vector2.MoveTowards(transform.position, enemyTargets[targetIndex].position,bounceSpeed*Time.deltaTime);
//3.当可以弹跳且列表内数量大于0,调用ToWords,这将使剑能够跳到敌人身上
if (Vector2.Distance(transform.position, enemyTargets[targetIndex].position)<.1f)
{
targetIndex++;
amountOfBounce--;//设置弹跳次数
if (amountOfBounce <= 0)
{
isBouncing = false;
isReturning = true;
}//这样会使当弹跳次数为0时,返回到角色手中
if (targetIndex >= enemyTargets.Count)
{
targetIndex = 0;
}
}//利用与目标距离的判断,使剑接近目标距离时切换到下一个目标。
//且如果所有目标都跳完了,切回第一个
}
}
private void OnTriggerEnter2D(Collider2D collision)//传入碰到的物体的碰撞器
{
if (isReturning)
{
return;
}//修复在返回时扔出时没有碰到任何物体,但返回时碰到了物体导致剑的一些性质发生改变的问题,及回来的时候调用了OnTriggerEnter2D
if (collision.GetComponent<Enemy>() != null)//首先得碰到敌人,只有碰到敌人才会跳
{
if (isBouncing && enemyTargets.Count <= 0)
{
Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 10);
foreach (var hit in colliders)
{
if (hit.GetComponent<Enemy>() != null)
{
enemyTargets.Add(hit.transform);
}
}
}
}
StuckInto(collision);
}//打开IsTrigger时才可使用该函数
//https://docs.unity3d.com/cn/current/ScriptReference/Collider2D.OnTriggerEnter2D.html
private void StuckInto(Collider2D collision)
{
canRotate = false;
cd.enabled = false;//相当于关闭碰撞后触发函数。//https://docs.unity3d.com/cn/current/ScriptReference/Collision2D-enabled.html
rb.isKinematic = true;//开启物理学反应 https://docs.unity3d.com/cn/current/ScriptReference/Rigidbody2D-isKinematic.html
rb.constraints = RigidbodyConstraints2D.FreezeAll;//冻结所有移动
if (isBouncing&&enemyTargets.Count>0)//修复剑卡不到墙上的bug
return;
//终止对动画的改变和终止附在敌人上
transform.parent = collision.transform;//设置sword的父组件为碰撞到的物体
anim.SetBool("Rotation", false);
}
}