今天做了一个皇室战争使用“火球”攻击敌人的效果,当然是简易版的。也是跟上一篇博文有联系。
玩过皇室战争的人都知道这张卡片,当火球爆炸的时候会将敌人“炸开”,也就是将敌人推开,把对方的阵型打乱
步骤一:制作一个会“变大变小”的小球
为什么要让小球变大变小呢,因为Demo是2D的所以做一个变大变小的动画让人感觉这个小球在空中做了一个弧线运动(虽然很假)。。。这个肯定是要用Unity的Animation编辑器来编辑动画了
很简单只设置它的Scale就好了,我设置的是第一帧和最后一阵Scale为1,1,1 中间的时候为2,2,2;
步骤二:让“火球”飞一会
我们的“火球”可以变大变小了,现在就要让他飞到我们点击到的点,上代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Manager : MonoBehaviour
{
/// <summary>
/// 带碰撞的小球
/// </summary>
public GameObject player;
/// <summary>
/// 临时小球prefab
/// </summary>
public GameObject temp;
/// <summary>
/// 炮台
/// </summary>
public GameObject rect;
/// <summary>
/// 记录生成的小球
/// </summary>
GameObject go = null;
/// <summary>
/// 记录点击的点
/// </summary>
Vector2 clickPoint = Vector2.zero;
/// <summary>
/// 记录临时小球移动的方向
/// </summary>
Vector2 dir = Vector2.zero;
/// <summary>
/// 是否完成移动
/// </summary>
bool isDone = false;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
//记录鼠标点击的坐标
clickPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
//从炮台处生成临时小球
go = Instantiate(temp, rect.transform.position, Quaternion.identity) as GameObject;
//计算临时小球移动的方向
dir = clickPoint - (Vector2)go.transform.position;
}
if (go != null)
{
//移动临时小球
go.transform.Translate(dir * Time.deltaTime, Space.World);
//判断临时小球是否到鼠标点击的点
if (Vector2.Distance(go.transform.position, clickPoint) < 0.2f)
{
isDone = true;
//到达后销毁临时小球
Destroy(go.gameObject);
}
}
if (isDone)
{
//生成带碰撞的小球
GameObject playerGo = Instantiate(player, clickPoint, Quaternion.identity) as GameObject;
//1.5秒后销毁碰撞小球
//Destroy(playerGo.gameObject, 1.5f);
isDone = false;
}
}
}
将这个脚本挂在摄像机上即可。
步骤三:“炸开”敌人
生成的Player上挂载我上一篇的代码,只需在Start方法之前添加:
private void Awake()
{
targets = GameObject.FindGameObjectsWithTag("Enemy");
}
然后把上一篇有关小球移动的代码注释掉。
由步骤二可知当Temp的小球到达目的地之后销毁自身(自身并不带碰撞效果)然后再生成一个Player带“挤开”效果的小球。为什么不直接生成带碰撞效果的小球呢?因为是2D的如果直接生成带碰撞效果的小球,在进入“敌人”的时候就会将“敌人”挤开,效果很假,so我这种写法并不会在进入敌人群的时候发生碰撞效果!至此将敌人“炸开”的效果就做完了。 表达不是很清晰,见谅!:)
效果:
没有特效,没有Boom~~233