学习游戏制作记录(克隆技能)7.25

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<SpriteRenderer>();
}

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<Clone_Skill_Control>().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<Clone_Skill_Control>().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<Enemy>() != null)
{
hit.GetComponent<Enemy>().Damage();
}
}
}

private void FacingClosestEnemy()//克隆体转向的函数,在SetupClone()中调用
{
Collider2D\[\] collider2Ds = Physics2D.OverlapCircleAll(transform.position,25);
float closestEnemyDistance = Mathf.Infinity;//设置最小距离
foreach (var hit in collider2Ds)
{
if (hit.GetComponent<Enemy>() != 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);
}

}
}

演示:

相关推荐
格林威4 分钟前
C# 相机Burst模式图像采集:使用相机内存配合OpenCvSharp和Halcon实现短时间的高速采集的方法
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
sunshine22 girl5 分钟前
Angular7,9,学习笔记三 dom操作
笔记·学习·angular
春风解人意23 分钟前
从零开始学习嵌入式P28----线程
c语言·学习·算法
J总裁的小芒果1 小时前
参数过多-分批传参
c#
MartinYeung51 小时前
[论文学习]MAC:多智能体宪章学习
人工智能·学习·macos
典典分享指南1 小时前
短视频分镜提示词:让 AI 出片的产品口播
java·c#·bash·composer·symfony
小+不通文墨1 小时前
使用vscode里的U8G2 库编写OLED菜单控制
经验分享·笔记·单片机·嵌入式硬件·学习
每周报刊2 小时前
竞速座舱级视界:爱攻 AGP497UCZD 超宽 QDOLED 显示器解析
数据结构·游戏·计算机外设
摆烂老大2 小时前
论文学习 | HESS2025 | 中亚寒区季节水文预报
学习·机器学习·水文
西西弗Sisyphus2 小时前
模型训练 不同批次大小与学习率下的训练损失对比(1)
学习·batchsize·learning rate