文档章节

【原创】Unity3D 各种技能的释放效果

MrBlack
 MrBlack
发布于 2015/07/25 11:21
字数 739
阅读 116
收藏 2

玩过《魔兽世界》的朋友都清楚,魔兽的技能很华丽,但是技能的表现效果主要包括:在角色脚底显示技能效果(骑士的奉献),在选中的位置上显示技能效果(猎人的乱射),追踪角色的技能效果(法师的寒冰箭),在目标身上显示的技能效果(各种BUFF、DEBUFF),因为最近有在项目中使用,所以特地整理了下。

最终效果如下,可以按数字键 1 至 4 实现在脚底、目标位置、追踪、目标身上显示技能效果,如图:

在脚底的效果如图:

在目标位置的效果如图:

追踪的效果如图:

在目标身上的如图:

主要的代码如下,ParticleMoveItem.cs(追踪):

using UnityEngine;
using System.Collections;

/// <summary>
/// 追踪效果
/// </summary>
public class ParticleMoveItem : MonoBehaviour 
{
	private float speed = 15f;
	private bool moveStatus = false;

	private GameObject targetObject;
	private Vector3 direction;

	public void ChangeData(GameObject targetObject)
	{
		this.moveStatus = true;
		this.targetObject = targetObject;
	}

	void Update()
	{
		if(!this.moveStatus) return;

		this.direction = (this.targetObject.transform.position - this.transform.position).normalized * this.speed;
		// 看向目标
		this.transform.LookAt (this.targetObject.transform.position);

		if(!IsArrivePosition())
		{
			this.transform.position += direction * Time.deltaTime;
		}else{
			this.moveStatus = false;
			// 设置目标点
			this.transform.position = this.targetObject.transform.position;
			// 销毁对象
			Destroy(this.gameObject);
		}
	}
	
	private bool IsArrivePosition()
	{
		Vector3 currentDirection = (this.targetObject.transform.position - (this.transform.position + this.direction * Time.deltaTime)).normalized;
		if (this.CalculateNormalized (currentDirection) == this.CalculateNormalized (this.direction) * -1) 
		{
			return true;
		}
		return false;
	}
	
	private Vector3 CalculateNormalized(Vector3 data)
	{
		Vector3 position = Vector3.zero;
		if(data.x != 0) position.x = data.x > 0 ? 1 : -1;
		if(data.z != 0) position.z = data.z > 0 ? 1 : -1;
		return position;
	}
}

ParticleTimeItem.cs(Buff、DeBuff 效果):

using UnityEngine;
using System.Collections;

/// <summary>
/// Buff、Debuff 效果
/// </summary>
public class ParticleTimeItem : MonoBehaviour 
{
	public void SetTotalTime(int totalTime)
	{
		// 时间到了销毁
		this.Invoke ("DestoryOperater", totalTime);
	}

	private void DestoryOperater()
	{
		Destroy (this.gameObject);
	}
}

Controller.cs(目标位置、脚底):

using UnityEngine;
using System.Collections;

public class Controller : MonoBehaviour 
{
	public PlayerItem playerItem;
	public RoleMoveItem roleItem;

	public Camera mainCamera;

	public GameObject effect1;
	public GameObject effect2;
	public GameObject effect3;
	public GameObject effect4;

	private bool effectStatus = false;

	void Update()
	{
		// 脚底技能效果
		if(Input.GetKeyDown(KeyCode.Alpha1)) this.UseEffectOne();
		if(Input.GetKeyDown(KeyCode.Alpha2)) this.effectStatus = true; 
		if(Input.GetKeyUp(KeyCode.Alpha2)) this.effectStatus = false; 
		// 追踪技能效果
		if(Input.GetKeyDown(KeyCode.Alpha3)) this.UseEffectThree(); 
		// 目标身上技能效果
		if(Input.GetKeyDown(KeyCode.Alpha4)) this.UseEffectFour(); 
		// 目标位置技能效果
		if(this.effectStatus && Input.GetMouseButtonDown(0)) this.UseEffectTwo();
	}

	private void UseEffectOne()
	{
		GameObject effectObject = (GameObject)Instantiate(this.effect1);
		if(effectObject != null)
		{
			effectObject.transform.localScale = new Vector3(1f, 1f, 1f);
			effectObject.transform.position = this.GetTerrainPosition(this.playerItem.transform.position);
		}
	}

	private void UseEffectTwo()
	{
		Ray ray = this.mainCamera.ScreenPointToRay(Input.mousePosition);
		RaycastHit raycastHit = new RaycastHit();
		if(Physics.Raycast(ray, out raycastHit))
		{
			if(raycastHit.collider.tag == "Terrain")
			{
				GameObject effectObject = (GameObject)Instantiate(this.effect2);
				if(effectObject != null)
				{
					effectObject.transform.localScale = new Vector3(1f, 1f, 1f);
					effectObject.transform.position = this.GetTerrainPosition(raycastHit.point);
				}
			}
		}
	}
	
	private void UseEffectThree()
	{
		GameObject effectObject = (GameObject)Instantiate(this.effect3);
		if(effectObject != null)
		{
			effectObject.transform.localScale = new Vector3(1f, 1f, 1f);
			// 粒子出现了当前角色的手部位置
			effectObject.transform.position = this.playerItem.effectTraceObject.transform.TransformPoint(Vector3.zero);

			ParticleMoveItem particleMoveItem = effectObject.GetComponent<ParticleMoveItem>();
			if(particleMoveItem != null) particleMoveItem.ChangeData(this.roleItem.headObject);
		}
	}

	private void UseEffectFour()
	{
		GameObject effectObject = (GameObject)Instantiate(this.effect4);
		if(effectObject != null)
		{
			// 设置到目标身上
			effectObject.transform.parent = this.playerItem.transform;
			effectObject.transform.localScale = new Vector3(1f, 1f, 1f);
			// 设置粒子显示效果的位置
			effectObject.transform.position = this.playerItem.effectSelfObject.transform.TransformPoint(Vector3.zero);

			ParticleTimeItem particleTimeItem = effectObject.GetComponent<ParticleTimeItem>();
			if(particleTimeItem != null) particleTimeItem.SetTotalTime(10);
		}
	}

	/// <summary>
	/// 获取地形高度
	/// </summary>
	/// <returns>The terrain position.</returns>
	/// <param name="position">Position.</param>
	private Vector3 GetTerrainPosition(Vector3 position)
	{
		Vector3 data = new Vector3 (position.x, 0f, position.z);
		data.y = Terrain.activeTerrain.SampleHeight (data);
		return data;
	}

	void OnGUI ()
	{
		GUI.Label(new Rect(15, 15,300, 100), "按数字键1在脚底释放技能\n按数字键2,同时在地面点击鼠标,会在目标位置上释放技能\n按数字键3会释放追踪技能\n按数字键4,会在角色身上释放技能");
	}
}

下载地址:链接: http://pan.baidu.com/s/1jGoyGmE 密码: mive

© 著作权归作者所有

共有 人打赏支持
MrBlack
粉丝 0
博文 14
码字总数 11101
作品 0
闸北
高级程序员
私信 提问
Unite Beijing 2018 | 技术专场部分精彩议题曝光

离5月11-13日的Unite Beijing 2018的开幕仅剩一个半月了,届时来自全球的Unity技术达人,行业精英和全球合作伙伴将为你带来史无前例的80余场技术演讲,内容涵盖Unity跨平台内容开发经验,标杆...

weixin_41849687
2018/04/20
0
0
Unity2018.3中文更新日志速览版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhenghongzhi6/article/details/85074629 本文首发于洪流学堂微信公众号。 洪流学堂,学Unity快人几步 Unity2...

关尔Manic
2018/12/18
0
0
Unity 动态水体涟漪效果。适用与船体,人物等在水面的移动,所产生的涟漪效果。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/KiTok/article/details/80418981 1.发现网上这个资源的好少。所以就补发一个,供大家玩耍。 插件地址:Unity...

KitStar
2018/05/23
0
0
Unity3D 游戏引擎之IOS高级界面发送消息与Unity3D消息的接收(九)

Unity3D 游戏引擎之IOS高级界面发送消息与Unity3D消息的接收 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6926746 ...

彭博
2012/03/09
770
0
Unity3D AR技术 vuforia SDK

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【119706192】 本文链接地址: Unity3D AR技术 vuforia SDK 公司新项目要使用ar技术(增强现实),网上搜了些相关资料发现使用最...

Ida62
2014/05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rabbitmq安装教程

RabbitMQ有Windows与Linux版本的,这里先写Windows版本的安装。 以前安装软件总是在百度上找某某安装教程,结果能按照教程安装好的软件真的不多。想起先前以为大牛说的一句话,去官网按照官网...

em_aaron
今天
6
0
Android 贝塞尔曲线实践——波浪式运动

一、波浪效果如下 贝塞尔曲线自定义波浪效果的案例很多,同样方法也很简单,大多数和本案例一样使用二次贝塞尔曲线实现,同样还有一种是PathMeasure的方式,这里我们后续补充,先来看贝塞尔曲...

IamOkay
今天
3
0
Nmap之防火墙/IDS逃逸

选项 解释 -f 报文分段 --mtu 指定偏移大小 -D IP欺骗 -sI 原地址欺骗 --source-port 源端口欺骗 --data-length 指定发包长度 --randomize-hosts 目标主机随机排序 --spoof-mac Mac地址欺骗 ...

Frost729
今天
2
0
带你搭一个SpringBoot+SpringData JPA的环境

不知道大家对SpringBoot和Spring Data JPA了解多少,如果你已经学过Spring和Hibernate的话,那么SpringBoot和SpringData JPA可以分分钟上手的。 其实我在学完SpringBoot和SpringData JPA了之...

java菜分享
今天
7
0
Chocolatey 在Window搭建一个开发环境

在看了(利用 Chocolatey 快速在 Windows 下搭建一个开发环境)后,准备从零开始 一、准备工作 1、用管理员权限启动:powershell,执行错误请参考(PowerShell因为在此系统中禁止执行脚本的解...

近在咫尺远在天涯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部