【RPG黑暗之光】第五章· 技能设定与学习

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中涉及到的内容

 

 

 

 

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

 

 

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

 

 

 

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值