p=65 CloneSkill (克隆技能) ;类恶魔城Demo学习
写的有点乱
思路:克隆一个就等于新建一个对象(Object)
实现:我们新建一个Object,加入动画和动画控制(把plyaer闲置攻击放进去)之类的。
然后保存的Prevap文件夹(等于预制,之后影分身几个,弄几个预制对象出来就好了)
先创建CloneSkill,再去SkillManager加入CloneSkill,CloneSkill有个变量是Object,放入我们要生成的克隆对象
前面未实现过程,成果看后面:
CloneSkill的代码(后面改进):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CloneSkill : Skill
{
[SerializeField] private GameObject clonePrefab;
public void CreateClone()
{
//将预制对象生成出来成为对象
GameObject newClone = Instantiate(clonePrefab);
}
}
查DeepSeek补充:Instantiate(prefabVariant)作用:支持生成Prefab Variant(继承父预制体但允许覆盖属性)
最后我们找到要生成克隆的地方(我感觉很多地方能用到,各种技能特效或者真分身),本节在Dash(DashState)原地会留下这用到克隆
一、增加克隆效果
问题:克隆体想在指定位置
正规点的流程:先将克隆体新加脚本,新加方法设置克隆体所在的值
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Clone_Skill_Controller : MonoBehaviour
{
//这里的 transform是克隆体的,因为这个脚本放在克隆组件里
//传入的值赋予克隆体
public void SetupClone(Transform _newTransform)
{
transform.position = _newTransform.position;
}
}
改进一下CloneSkill的代码(新加入 调用克隆脚本方法 )
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CloneSkill : Skill
{
[SerializeField] private GameObject clonePrefab;
public void CreateClone(Transform _clonePosition)
{
GameObject newClone = Instantiate(clonePrefab);
newClone.GetComponent<Clone_Skill_Controller>().SetupClone(_clonePosition);
}
}
这里饶了一圈,主要是CloneController这传值改变位置,有了这个克隆可以生成在不同位置。不一定要在player位置。后续开发更方便
DashState代码 (新加)
public override void Enter()
{
base.Enter();
stateTimer = player.dashDuration;
SkillManager.instance.clone.CreateClone(player.transform);
}
二、克隆消失效果
思路:定义一个计时器(time)和颜色流失速度(float)。
调用SpriteRenderer的颜色方法,里面参数为:
sr.a - (计时器*颜色流失速度) ,
则实现渐渐消失效果。
注:如果慢慢生成多个克隆,可使用协程(Coroutine) 结合 WaitForSeconds。然后调用多次cloneSkill
细节:StartCoroutine是MonoBehaviour类的成员方法,必须通过继承MonoBehaviour的类的实例调用
例子:
using UnityEngine;
using System.Collections;
public class RepeatAction : MonoBehaviour
{
void Start()
{
StartCoroutine(RepeatThreeTimes());
}
IEnumerator RepeatThreeTimes()
{
for (int i = 0; i < 3; i++)
{
// 执行你的操作(例如攻击、生成物体等)
Debug.Log("执行操作,当前次数: " + (i + 1) + ",时间: " + Time.time);
// 前两次执行后等待 1 秒,最后一次不等待
if (i < 2)
{
yield return new WaitForSeconds(1f);
}
}
}
}