1.实现冲刺后在原角色位置留下克隆体的功能
我们需要在玩家进入冲刺状态时创建一个对象,这可以使用预制体来实现
首先创建一个玩家的预制体,并给它装载动画控制器,拖入待机和攻击动画,最后把整个拖入你的预制体文件夹。
修改Player脚本:
public SkillManage skill { get; private set; }
skill = SkillManage.instance;//简化代码,后面只需要写skill.即可
创建Clone_Skill_Control脚本:
private SpriteRenderer sr;
**[SerializeField] private float CloneTimer;//克隆计时器
SerializeField\] private float colorloosingSpeed;//克隆体消失的速度**
**private void Awake()
{
sr = GetComponent\();
}**
**private void Update()
{
CloneTimer -= Time.deltaTime;**
**if(CloneTimer \< 0 )
{
sr.color=new Color(1,1,1,sr.color.a-Time.deltaTime\*colorloosingSpeed);//更改透明度
}**
**if(sr.color.a\<=0 )
{
Destroy(gameObject);//透明度消失则删除克隆体
}
}**
**public void SetupClone(Transform newtransform,float clonduration)
{
transform.position = newtransform.position;//更改克隆体的位置,确保在玩家的位置
CloneTimer = clonduration;
}**
### 创建Clone_Skill脚本并在SkillManage脚本中初始化:
**\[Header("Clone info")
SerializeField\] private GameObject ClonePrefab;//预制体
\[SerializeField\] private float cloneDuration;//克隆持续时间**
**public void CreatClone(Transform newtransform)
{
GameObject newclone= GameObject.Instantiate(ClonePrefab);//创建预制体对象**
**newclone.GetComponent\().SetupClone(newtransform, cloneDuration);//更改位置和冷却时间
}**
### PlayerDashState脚本:
Enter中:
**_Player.skill.clone.CreatClone(_Player.transform);//进入时调用创建预制体函数**
演示:
## 2.实现克隆体的攻击功能
首先创建动画参数AttackNumber,大于0时进入空状态,等于1,2,3时分别播放攻击动画123
### Clone_Skill脚本:
**\[SerializeField\] private bool canAttack;//克隆体是否可以攻击**
**newclone.GetComponent\().SetupClone(newtransform, cloneDuration, canAttack);//传入上面参数**
### Clone_Skill_Control脚本:
**private Animator anim;//动画组件**
**\[SerializeField\] private Transform attackCheck;//克隆体的攻击检测,需要自行修改预制体,添加攻击检测的子对象
\[SerializeField\] private float attackCheckRadius = .8f;**
**private Transform closestEnemy;//检测最近的敌人**
**private void AnimationTrigger()//攻击动画结束时调用的函数,克隆体删除
{
CloneTimer = -1f;
}**
**private void AttackTrigger()//攻击动画中的一帧调用的函数
{
Collider2D\[\] collider2Ds = Physics2D.OverlapCircleAll(attackCheck.position, attackCheckRadius);**
**foreach (var hit in collider2Ds)
{
if (hit.GetComponent\() != null)
{
hit.GetComponent\().Damage();
}
}
}**
**private void FacingClosestEnemy()//克隆体转向的函数,在SetupClone()中调用
{
Collider2D\[\] collider2Ds = Physics2D.OverlapCircleAll(transform.position,25);
float closestEnemyDistance = Mathf.Infinity;//设置最小距离
foreach (var hit in collider2Ds)
{
if (hit.GetComponent\() != null)
{
float distanceToEnemy=Vector2.Distance(transform.position,hit.transform.position);//计算与每个敌人的距离**
**if(distanceToEnemy \< closestEnemyDistance)
{
closestEnemyDistance = distanceToEnemy;//更新最小距离
closestEnemy = hit.transform;//记录最近的敌人的组件
}
}
}
if(closestEnemy!=null)
{
if(transform.position.x\>closestEnemy.position.x)//实现翻转
{
transform.Rotate(0, 180, 0);
}**
**}
}**
演示: