1.实现剑的弹跳
思路即当剑碰到第一个敌人时会在一定范围内检测是否有其它敌人,将这些敌人添加为一个列表,然后进行一定次数的弹跳,当弹跳数减为0时返回玩家。
首先实现在列表中加入敌人:
Sword_Skill_Control脚本:
public bool isBouncing;//是否可以弹射
public float amountofBounce;//弹射次数
public List<Transform> enemyTarget;//检测敌人的列表
private int targetIndex;//目标敌人索引
if(collision.GetComponent<Enemy>()!= null)//在触发器函数里调用
{
if (isBouncing && enemyTarget.Count <= 0)
{
Collider2D[] collider2D = Physics2D.OverlapCircleAll(transform.position,10);
foreach(Collider2D hit in collider2D)
{
if(hit.GetComponent<Enemy>() != null)
{
enemyTarget.Add(hit.transform);//当检测到附近有敌人时添加
}
}
}
}
实现剑的跳跃移动
Sword_Skill_Control脚本:
public float bouncingSpeed;//弹跳速度
private void StuckInto(Collider2D collision)//提取并修改方法,在触发器函数中调用这个函数
{
canRotate = false;
cd.enabled = false;
rb.isKinematic = true;
rb.constraints = RigidbodyConstraints2D.FreezeAll;
if (isBouncing && enemyTarget.Count > 0)//如果可以弹跳并且附近有敌人
return;
transform.parent = collision.transform;//否则嵌入地面
anim.SetBool("rotation", false);
}
if(isBouncing&&enemyTarget.Count>0)//Update中调用
{
transform.position = Vector2.MoveTowards(transform.position, enemyTarget[targetIndex].position,bouncingSpeed*Time.deltaTime);//移动
if(Vector2.Distance(transform.position, enemyTarget[targetIndex].position)<.1f)//当与敌人距离小于0.1时弹跳到下一个敌人
{
targetIndex++;
amountofBounce–;
if (amountofBounce <= 0)//弹跳次数耗尽直接返回
{
isBouncing = false;
isReturning = true;
}
if (targetIndex >= enemyTarget.Count)//重置索引
{
targetIndex = 0;
}
}
}
2.设置剑的类型
Sword_Skill_Control脚本:
[Header("Bounce info")]//更改一下私有
private bool isBouncing;
private int amountofBounce;
[SerializeField] private float bouncingSpeed;
private List<Transform> enemyTarget;//需要自行分配
private int targetIndex;
public void SetupBounce(bool _isBouncing,int _amountofBounce) //弹跳剑的设置
{
isBouncing = _isBouncing;
amountofBounce = _amountofBounce;
enemyTarget = new List<Transform>();
}
Sword_Skill脚本:
public enum SwordType
{
Regular,
Bounce,
Pierce,
Spin
}//剑的类型
public SwordType swordType= SwordType.Regular;//默认常规剑
[Header("Bounce info")]
[SerializeField] private int amounceofBounce;//可以在技能管理器中设置这些值
[SerializeField] private float BounceGravity;
if(swordType==SwordType.Bounce)//在CreateSword()中调用
{
swordGravity = BounceGravity;//设置新的重力
newSkillScript.SetupBounce(true, amounceofBounce);
}
3.实现穿刺剑
首先穿刺剑的轨迹是一条直线,我们可以指定它穿刺敌人的数量,到达上限时回嵌入。
Sword_Skill_Control脚本:
[Header("Pierce info")]
private int pierceAmount;//穿刺数量
if (pierceAmount <= 0)//在SetupSword()中调用,这样穿刺时不会播放旋转动画
{
anim.SetBool("rotation", true);
}
public void SetupPierce(int _pierceAmount)//设置穿刺状态
{
pierceAmount = _pierceAmount;
}
collision.GetComponent<Enemy>()?.Damage();//触发器函数中调用
if(pierceAmount>0&&collision.GetComponent<Enemy>() != null)//StuckInto()函数中调用
{
pierceAmount–;//每穿刺一个敌人数量减一
return;
}
4.实现旋转剑
我们希望剑在碰到第一个敌人或者离开玩家一定距离停在原地旋转并造成持续伤害
首先我们实现剑在离开一定距离停下旋转
Sword_Skill_Control 脚本:
[Header("Spin info")]
private float maxTravelDistance;//飞行最大距离
private float spinDuration;//旋转持续时间
private float spinTimer;//计时器
private bool wasStopped;//是否停下
private bool isSpinning;
public void SetupSpin(bool _isSpinning,float _maxTravelDistance,float _spinDuration)//设置
{
isSpinning= _isSpinning;
maxTravelDistance = _maxTravelDistance;
spinDuration = _spinDuration;
}
if(isSpinning)//在Update()中调用
{
if(Vector2.Distance(transform.position,player.transform.position) >maxTravelDistance&&!wasStopped)//当未停下且距离超过最大距离
{
wasStopped= true;
spinTimer = spinDuration;
rb.constraints = RigidbodyConstraints2D.FreezePosition;//锁定位置
}
if(wasStopped)
{
spinTimer -= Time.deltaTime;//停下时开始计时
if(spinTimer<0)//结束返回
{
isReturning = true;
isSpinning = false;
}
}
}
if(isSpinning)//StuckInto(Collider2D collision)中调用
{
return;
}
Sword_Skill脚本:
[Header("Spin info")]
[SerializeField] private float maxTravelDistance = 7f;
[SerializeField] private float spinDuration = 2f;
[SerializeField] private float spinGravity = 1f;//记得在SetupGravity()中添加设置旋转重力
else if(swordType==SwordType.Spin)//CreateSword()调用
{
newSkillScript.SetupSpin(true, maxTravelDistance, spinDuration);
}
造成持续性伤害
Sword_Skill脚本:
[SerializeField] private float hitCoolDown = .35f;//造成伤害的间隔时间
newSkillScript.SetupSpin(true, maxTravelDistance, spinDuration,hitCoolDown);//传入
Sword_Skill_Control脚本:
private float hitTimer;//伤害计时器
private float hitCoolDown;
if(wasStopped)
{
spinTimer -= Time.deltaTime;
if(spinTimer<0)
{
isReturning = true;
isSpinning = false;
}
hitTimer-=Time.deltaTime;//停下时开始计时
if(hitTimer<0)
{
hitTimer = hitCoolDown;//重置攻击
Collider2D[] collider2D = Physics2D.OverlapCircleAll(transform.position, 1);//范围1内的圆形区域受到伤害
foreach (Collider2D hit in collider2D)
{
if (hit.GetComponent<Enemy>() != null)
{
hit.GetComponent<Enemy>().Damage();//调用伤害函数
}
}
}
}
实现剑碰到第一个敌人时停下开始旋转
Sword_Skill_Control脚本:
private void StopWhenSpinning()//提取方法
{
wasStopped = true;
spinTimer = spinDuration;
rb.constraints = RigidbodyConstraints2D.FreezePosition;
}
if(isSpinning)//在StuckInto(Collider2D collision)中调用
{
StopWhenSpinning();//停止
return;
}
5.修复反弹剑没有伤害的bug
Sword_Skill_Control脚本:
private void BounceLogic()//这是提取后的方法
{
if (isBouncing && enemyTarget.Count > 0)
{
transform.position = Vector2.MoveTowards(transform.position, enemyTarget[enemyIndex].position, bouncingSpeed * Time.deltaTime);
if (Vector2.Distance(transform.position, enemyTarget[enemyIndex].position) < .1f)
{
enemyTarget[enemyIndex].GetComponent<Enemy>().Damage();//添加调用伤害函数即可
enemyIndex++;
bounceAmount–;
if (bounceAmount <= 0)
{
isBouncing = false;
isReturning = true;
}
if (enemyIndex >= enemyTarget.Count)
{
enemyIndex = 0;
}
}
}
}
6.实现旋转剑能够朝着飞行方向缓慢移动
Sword_Skill_Control脚本:
private float SpinDirection;
SpinDirection = Mathf.Clamp(rb.velocity.x, -1, 1);//将旋转方向控制在-1到1
transform.position = Vector2.MoveTowards(transform.position, new Vector2(transform.position.x + SpinDirection, transform.position.y), 1.5f * Time.deltaTime);//在SpinLogic()
函数里添加,当停止后开始旋转时会有微小的移动
评论前必须登录!
注册