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<Transform> 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<Enemy>() != null)
{
EnemyTarget.Add(collision.GetComponent<Enemy>().transform);
}
}
實現黑洞中敵人的凍結和敵人頭頂預制快捷鍵的生成
Blackhole_Skill_Control腳本:
? ? ? ? if(collision.GetComponent<Enemy>() != null)
{
collision.GetComponent<Enemy>().FreezeTime(true);//直接調用凍結函數
}
安裝TextMeshPro
創建一個黑色方塊對象,添加ui文字
設置黑色背景
畫布設置,調整大小
文本設置,記得居中
最終效果:
創建Blackhole_HotKey_Control腳本掛載在上面的對象:
? ? private KeyCode myhotKey;//我的預制鍵
private TextMeshProUGUI myText;//文本
? ? public void SetupHotKey(KeyCode _mynewhotKey)//觸發器里會調用它
{
myText = GetComponentInChildren<TextMeshProUGUI>();
? ? ? ? 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<KeyCode> KeyCodeList;//鍵的列表,自行添加
? ? private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.GetComponent<Enemy>() != null)
{
collision.GetComponent<Enemy>().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<Blackhole_HotKey_Control>();
? ? ? ? ? ? newhotKeyScript.SetupHotKey(chooseKey);//設置鍵碼
}
}
}
演示:
實現按下相應按鍵將敵人添加到列表中并且使按鍵不可見:
Blackhole_Skill_Control腳本:
?private List<Transform> EnemyTarget=new List<Transform>();
?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<TextMeshProUGUI>();
? ? ? ? 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;
}
}