学习游戏制作记录(冻结敌人时间与黑洞技能)7.30

1.实现剑击中敌人时冻结敌人时间

Enemy脚本:

public float defaultMoveSpeed;//默认速度

defaultMoveSpeed = moveSpeed;//Awake()中设置

public virtual void FreezeTime(bool _timeFreeze)//冻结设置函数
{
if (_timeFreeze)
{
moveSpeed = 0;
anim.speed = 0;
}

else
{
moveSpeed = defaultMoveSpeed;
anim.speed = 1;
}
}

protected virtual IEnumerator FreezeTimeFor(float _seconds)//冻结协程
{
FreezeTime(true);

yield return new WaitForSeconds(_seconds);

FreezeTime(false);//解除冻结

}

Sword_Skill脚本:

**[Header("FreezeTime info")]

SerializeField\] private float freezeTimeDuration;//冻结时间** **newSkillScript.SetupSword(finalDir, swordGravity, player,freezeTimeDuration);//设置** **Sword_Skill_Control脚本:** **\[Header("FreezeTime info")

private float freezeTimeDuration;//接受传入的冻结时间**

if(collision.GetComponent<Enemy>() != null)//触发器函数中调用
{
Enemy enemy = collision.GetComponent<Enemy>();
enemy.Damage();//将这两句提取为SwordSkillDamage方法,方便调用
enemy.StartCoroutine("FreezeTimeFor", freezeTimeDuration);//启用协程

}

SwordSkillDamage(enemyTarget[enemyIndex].GetComponent<Enemy>());//弹跳逻辑函数中

SwordSkillDamage(hit.GetComponent<Enemy>());//旋转逻辑函数中

2.实现剑超过一定时间会自行销毁

Sword_Skill_Control脚本:

public void DestroyMe()//自毁函数
{
Destroy(gameObject);
}

Invoke("DestroyMe", 7f);//7秒后自毁,SetupSword调用

3.实现在技能管理器中设置返回速度和弹跳速度(其它类似)

Sword_Skill_Control脚本:

returnSpeed = _returnSpeed;

bouncingSpeed= _BounceSpeed;//在各自的设置函数里添加

**Sword_Skill脚本:

SerializeField\] private float bounceSpeed;** **\[SerializeField\] private float returnSpeed;//可以直接修改** **newSkillScript.SetupSword(finalDir, swordGravity, player,freezeTimeDuration,returnSpeed);** **newSkillScript.SetupBounce(true, bounceAmount,bounceSpeed);//传入参数** ## 4.实现黑洞与快速时间事件 当释放黑洞技能时,会创建一个随时间增大的圆形物体,它会检测圆内的所有敌人并冻结敌人时间,并且在每个敌人头上会生成一个快捷预制按键,当玩家按下按键时会调用函数将相应的敌人添加到一个未来的目标列表中,当所有按键都被按下或者时间耗尽时,我们会在目标列表敌人处创建一个克隆攻击。 ### 实现黑洞的增大与敌人列表获取 #### 准备好Blackhole_Skill_Control脚本和圆形对象(添加碰撞器并勾选触发器): **public float maxSize;//最大尺寸 public float growSpeed;//变化速度 public bool canGrow;//是否可以变大** **public List\ EnemyTarget;//获取的敌人 private void Update() { if (canGrow) { transform.localScale=Vector2.Lerp(transform.localScale,new Vector2(maxSize, maxSize),growSpeed\*Time.deltaTime);//Lerp是缓慢变化,变化transform的规模 }** **}** **private void OnTriggerEnter2D(Collider2D collision)//触发器函数 { if(collision.GetComponent\() != null) { EnemyTarget.Add(collision.GetComponent\().transform); } }** ![](https://i-blog.csdnimg.cn/direct/bdb54f7d0b6a4213ae2a47fb8bf0522d.png) ### 实现黑洞中敌人的冻结和敌人头顶预制快捷键的生成 #### Blackhole_Skill_Control脚本: **if(collision.GetComponent\() != null) { collision.GetComponent\().FreezeTime(true);//直接调用冻结函数 }** 安装TextMeshPro ![](https://i-blog.csdnimg.cn/direct/4aaa29ceb0ab4ec39318dad2e898ed09.png) 创建一个黑色方块对象,添加ui文字 ![](https://i-blog.csdnimg.cn/direct/d55366b97b2e4f5490ed055603f11a91.png)设置黑色背景 ![](https://i-blog.csdnimg.cn/direct/989cee35aca548ee903574d692e6f514.png)画布设置,调整大小 ![](https://i-blog.csdnimg.cn/direct/a6fef32b9d3548bea7f2f0aa602d17da.png)文本设置,记得居中 最终效果: ![](https://i-blog.csdnimg.cn/direct/7158f2aae91a458eaa5a8a738de7a1e9.png) #### 创建Blackhole_HotKey_Control脚本挂载在上面的对象: **private KeyCode myhotKey;//我的预制键 private TextMeshProUGUI myText;//文本** **public void SetupHotKey(KeyCode _mynewhotKey)//触发器里会调用它 { myText = GetComponentInChildren\();** **myhotKey = _mynewhotKey; myText.text =_mynewhotKey.ToString();//修改文本 }** **public void Update() { if(Input.GetKeyUp(myhotKey)) //调试 { Debug.Log("i enter"+ myhotKey.ToString());** **} }** #### Blackhole_Skill_Control脚本: **\[SerializeField\] private GameObject hotKeyPrefab;//按键预制体 \[SerializeField\] private List\ KeyCodeList;//键的列表,自行添加** **private void OnTriggerEnter2D(Collider2D collision) { if(collision.GetComponent\() != null) { collision.GetComponent\().FreezeTime(true);//可以把下面的代码提取方法为CreateHotKey()** **if(KeyCodeList.Count\<=0) { return; }** **GameObject newhotKey= Instantiate(hotKeyPrefab,collision.transform.position+new Vector3(0,2),Quaternion.identity);//在敌人头上创建预制键** **KeyCode chooseKey = KeyCodeList\[Random.Range(0,KeyCodeList.Count)\];//随机选择一个键码** **KeyCodeList.Remove(chooseKey);//选择后移除防止重复** **Blackhole_HotKey_Control newhotKeyScript=newhotKey.GetComponent\();** **newhotKeyScript.SetupHotKey(chooseKey);//设置键码 } }** **}** 演示: ![](https://i-blog.csdnimg.cn/direct/119222951baf447cb1ae5468387cc217.png) ### 实现按下相应按键将敌人添加到列表中并且使按键不可见: #### Blackhole_Skill_Control脚本: **private List\ EnemyTarget=new List\();** **newhotKeyScript.SetupHotKey(chooseKey, collision.transform, this);//传入参数** **public void AddEnemyToList(Transform _enemyTransform) =\> EnemyTarget.Add(_enemyTransform);//添加列表函数** #### Blackhole_HotKey_Control脚本: **private SpriteRenderer sr;** **private Transform myEnemy;//每个按键对应的敌人 private Blackhole_Skill_Control Blackhole;//按键对应的黑洞** **public void SetupHotKey(KeyCode _mynewhotKey,Transform _myEnemy,Blackhole_Skill_Control _Blackhole)//重新初始化 { myText = GetComponentInChildren\();** **myhotKey = _mynewhotKey; myText.text =_mynewhotKey.ToString();** **myEnemy = _myEnemy; Blackhole = _Blackhole; }** **public void Update() { if(Input.GetKeyUp(myhotKey)) { Blackhole.AddEnemyToList(myEnemy);//添加到列表** **myText.color = Color.clear;//设置透明 sr.color = Color.clear; } }**

相关推荐
SchuylerEX5 分钟前
第六章 JavaScript 互操(2).NET调用JS
前端·c#·.net·blazor·ui框架
★YUI★10 分钟前
学习游戏制作记录(制作系统与物品掉落系统)8.16
学习·游戏·ui·unity·c#
努力还债的学术吗喽30 分钟前
【速通】深度学习模型调试系统化方法论:从问题定位到性能优化
人工智能·深度学习·学习·调试·模型·方法论
南猿北者5 小时前
Cmake学习笔记
笔记·学习·策略模式
diablobaal6 小时前
云计算学习100天-第26天
学习·云计算
测试老哥7 小时前
pytest+requests+allure自动化测试接入Jenkins学习
自动化测试·软件测试·学习·测试工具·职场和发展·jenkins·pytest
lingzhilab7 小时前
零知开源——基于STM32F103RBT6与ADXL362三轴加速度计的体感迷宫游戏设计与实现
游戏
SmalBox8 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
unity·渲染
mit6.8249 小时前
Linux下C#项目构建
开发语言·c#
代码改变世界100869 小时前
像素风球球大作战 HTML 游戏
前端·游戏·html