RPG游戏黑暗之光Part5:技能设定与学习

RPG游戏黑暗之光Part5:技能设定与学习

 

今天新开一章用来讲解技能的创建,首先我们要知道虽然技能是属于人物的,但并不要在人物下创建相关内容,这不单显得冗余,而当涉及到技能学习时也存在诸多不便。我们直接在ui界面中创建系统界面,最后的完成图如下。

 

这里牵涉到ui部件中的scrollbar,百度即可实现简单使用,这里不过多介绍。

点击学习以后在底部状态栏上显示出来并且按对应按键释放对应技能。

 

 

其实你完全可以把技能也当作一个物品来建立,但是每个物品需要自己的脚本来实现打击或者治疗效果,这里我们用一个简单的脚本来讲解比如技能火球术。

public class Skill1Script : MonoBehaviour {
public GameObject Skill1;
public float skillDistance = 5f;
public  UISprite Sprite;
public float TimeSpeed=2;
bool flag = false;
// Update is called once per frame
void Update () {
if (flag) {
Sprite.fillAmount -= (1f / TimeSpeed) * Time.deltaTime;
}
if (Sprite.fillAmount <= 0.05f)
{
flag = !flag;
Sprite.fillAmount = 1;
}
if (!flag) {
if (Input.GetKeyDown (KeyCode.Alpha1)) {
GameObject player = GameObject.FindWithTag ("Player");
//x,z在player面前
//localPosition是父元素下的
//然后是消耗mp移到Enemy身上打,-hp然后Destroy
//-mp
GameObject[] enemys = GameObject.FindGameObjectsWithTag ("Enemy");
//这里只是移一下!
Vector3 v = new Vector3 (player.transform.position.x, player.transform.position.y + 0.5f, player.transform.position.z);
int mp = player.GetComponent<PlayerStatus> ().mp;
foreach (GameObject gb in enemys) {
float distance = Vector3.Distance (gb.transform.position, v);
if (distance <= skillDistance && mp >= 10) {
GameObject skill = GameObject.Instantiate (Skill1, v, Quaternion.identity);
skill.SetActive (true);
skill.GetComponent<Skill1Move> ().SetFlag (true, gb);
GetComponent<AudioSource> ().Play ();
player.GetComponent<PlayerMover> ().state = PlayerState.Attack1;
player.GetComponent<PlayerStatus> ().mp -= 10;
flag = !flag;
break;
}
}
}
}
}
 
}


 

其中的Skill1;是我按1以后释放的gameobject,这个素材可以百度或者淘宝自寻找到,distance即为释放的距离长度,在这个脚本中按1后释放Skill1,然后播放音效到技能cd Destroy物体,细心的读者可能发现这里火球并没有飞起来,原因是我把它放到Skill1中的脚本里。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Skill1Move : MonoBehaviour {
public int speed = 10;
private bool flag = false;
private GameObject enemy;
private GameObject player;
private void Start(){
player = GameObject.FindWithTag ("Player");
}
// Update is called once per frame
void Update () {
if (flag) {
transform.LookAt (enemy.transform);
GetComponent<CharacterController> ().SimpleMove (transform.forward * speed);
player.transform.LookAt (enemy.transform);
if (Vector3.Distance (transform.position, enemy.transform.position) <= 1f) {
enemy.GetComponent<WolfBabyScript> ().OnAttacked (10);
Destroy (gameObject);
}
}
 
}
public void SetFlag(bool b,GameObject gb){
flag = b;
enemy = gb;
}
}


 

在这里就对火球移动方向进行了设置。

最终的实现效果

 

部分技能展示

 




 




 



 

对了在技能cd中涉及到的内容



 



updateSprite.fillAmount需要在视图中修改为Simple才生效


if (flag) {
Sprite.fillAmount -= (1f / TimeSpeed) * Time.deltaTime;
}


 

猜你喜欢

转载自blog.csdn.net/icesony/article/details/78607075