unity 拖尾 无效果2d物体怎么做拖尾效果

Cocos2d-x 3.x基础学习: 拖尾渐隐效果MotionStreak - cocos2dx技术 - 泰课在线 - 国内专业的Unity在线学习平台|Unity3d培训|Unity教程|Unity教程 Unreal 虚幻 AR|移动开发|美术CG|UI平面设计|前端开发 - Powered By EduSoho
Cocos2d-x 3.x基础学习: 拖尾渐隐效果MotionStreak
& & & &在许多游戏中,因为有些需要一些炫目的效果。比如我们有时会需要在某个游戏对象上的运动轨迹上实现拖尾渐隐效果,这种感觉就好像是类似飞机拉线似的拖尾巴,使我们的游戏在视觉上感觉很好。比如:刀光、子
弹的运动轨迹、流星划痕等等。
Cocos2d-x提供了一种内置的拖尾渐隐效果的实现方法:MotionStreak。
借用几张图
当然要做出酷炫的拖尾效果,都是需要与 粒子特效Particle 相结合的。
如下再附一张唯美的拖尾效果(MotionStreak + 粒子特效),增加大家学习的激情。虽然我不会弄爱心,但是我觉得你学完
MotionStreak,你肯定就会弄下面的爱心了。
【MotionStreak】
MotionStreak 的拖尾效果,原理实际上是:在相应距离内动态生成一段段的条带,然后一段段逐渐的消隐。
可以指定消隐的速度fade(时间秒),一段条带最小距离minSeg,以及条带的宽度粗细(stroke),条带的颜色值(color),以及相应的纹理图片对象。
原理说明:MotionStreak在移动的过程中(setPosition位置发生改变时),会动态生成一段段条带段,然后这些条带段会在生命周期fade秒内,渐渐隐去(慢慢变透明),从而形成了拖尾的效果。
如下如所示:
PS:因为是一段段条带相连形成拖尾,所以如果条带太粗(stroke太大),在视觉上可能会出现“脱节”的效果,就像上面的图一样。所以在实际使用中,stroke的大小设置应该合理。
2、创建方式
创建MotionStreak有两种方式:
一种是用图片资源文件作为纹理创建。
另一种是通过纹理图片Texture2D创建。
各个参数的说明,在“原理”中已经给出解释。
* 创建MotionStreak 的两种方式
// fade : 拖尾渐隐时间(秒)
// minSeg : 最小的片段长度(渐隐片段的大小)。拖尾条带相连顶点间的最小距离。
// stroke : 渐隐条带的宽度。
// color : 片段颜色值。
// path : 纹理图片的文件名。
// texture : 纹理图片的对象指针。
static MotionStreak* create(float fade, float minSeg, float stroke, const
Color3B& color, const std::string& path);
static MotionStreak* create(float fade, float minSeg, float stroke, const
Color3B& color, Texture2D* texture);
// 使用举例
auto motionstreak = MotionStreak::create(1.0f, 1.0f, 10.0f, Color3B(255, 0,
0), "streak.png");
3、相关函数
为了实现拖尾渐隐效果,MotionStreak还对Node类的一些函数进行了重载,如update、draw、setPosition等。
每当MotionStreak改变了位置(setPosition)后,就会形成一条拖尾。而update里则根据位置信息产生一段段新的顶点(条带段),并让之前生成的条带段渐隐或消失。
* 相关函数
* tintWithColor : 设置顶点颜色值。
* reset : 删除所有条带段,重置。
* setFastMode : 设置快速模式。
* setStartingPositionInitialized : 不需要了解,也不需要去使用。
// 条带段使用的颜色值
void tintWithColor(const Color3B& colors);
// 重置,删除所有条带段
void reset();
// 设置是否是快速模式, 默认为true
// 当为快速模式时,新的顶点被更快的加入,但是新的顶点具有更小的精确值
// PS:实践测试,请宽恕若菜的无知,若菜实在看不出有何区别。。。
inline bool isFastMode() const { return _fastM }
inline void setFastMode(bool bFastMode) { _fastMode = bFastM }
// 在刚创建MotionStreak的时候会置为false(表示创建后,还未移动过)
// 一旦改变Position(即移动后),会置为true(表示拖尾效果开始了,然后移动就会有拖尾的效果了)
// PS:一般不会手动去设置它,所以不需要了解这个函数。
inline bool isStartingPositionInitialized() const { return
_startingPositionI }
inline void setStartingPositionInitialized(bool
bStartingPositionInitialized) { _startingPositionInitialized =
bStartingPositionI }
4、支持Action动作
MotionStreak继承自Node类。而既然它一旦移动(位置Position发生改变)就会拉出一条拖尾,那么执行MoveTo/MoveBy 或者
JumpTo/JumpBy 等等Action动作,自然也是可以形成拖尾效果的啦。
5、使用步骤
(1)创建MotionStreak。MotionStreak::create()。
(2)将MotionStreak加入到场景中。this-&addChild()。
(3)设置位置MotionStreak-&setPosition();或执行移动Action动作。
(4)一旦改变了位置之后,就会形成一段拖尾效果了。
【代码实践】
1、《水果忍者》划动刀光效果(MotionStreak + 粒子特效)
代码实现可参见:http://cn.cocos2d-x.org/tutorial/show?id=2225
手势划动产生的刀光效果,是利用触摸移动事件,改变MotionStreak的位置,来形成拖尾的。
2、《流星划痕效果》(精灵移动 + MotionStreak + 粒子效果)
代码实现可参见:http://cn.cocos2d-x.org/tutorial/show?id=1483
流星的尾巴,是在schedule/update中不断改变MotionStreak的位置,来形成拖尾的。
以下,再让我介绍一个MotionStreak的简单实现的“酷炫”例子吧。
3、通过触摸事件,实现拖尾效果
图片资源借用《流星划痕效果》。
[PIC_XX.png]
[steak.png]
预期实现效果:
& 触摸开始touchBegan,流星的位置设置为触摸点位置。
& 触摸移动touchMoved,流星跟随触摸点移动而移动,同时MotionStreak跟随流星移动,形成拖尾效果。
创建两种不同规格的MotionStreak,看看效果。
& 设置minSeg = 50、stroke = 30、color = WHITE、纹理为steak.png 。
& 设置minSeg = 1 、stroke = 10、color = RED 、纹理为steak.png 。
3.1、在HelloWorld.h中添加如下变量与函数
class HelloWorld : public cocos2d::Layer
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(HelloWorld);
// 触摸事件 回调函数
bool onTouchBegan(Touch* pTouch, Event* pEvent);
void onTouchMoved(Touch* pTouch, Event* pEvent);
Sprite* // 流星精灵
MotionStreak* // 拖尾
3.2、在HelloWorld.cpp的init()中,创建流星精灵、MotionStreak拖尾,并添加触摸监听事件
bool HelloWorld::init()
if ( !Layer::init() )
// 流星精灵Sprtie
star = Sprite::create("PIC_XX.png");
star-&setPosition(100, 100);
this-&addChild(star);
// 流星拖尾MotionStreak
streak = MotionStreak::create(0.5f, 50, 30, Color3B::WHITE,
"steak.png");
// streak = MotionStreak::create(0.5f, 1, 10, Color3B::RED,
"steak.png");
streak-&setPosition(star-&getPosition()); // 设置拖尾streak的位置
this-&addChild(streak);
// 注册单点触摸
auto dispatcher = this-&getEventDispatcher();
auto listener = EventListenerTouchOneByOne::create();
listener-&onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan, this);
// 触摸开始
listener-&onTouchMoved = CC_CALLBACK_2(HelloWorld::onTouchMoved, this);
// 触摸移动
dispatcher-&addEventListenerWithSceneGraphPriority(listener, this);
3.3、实现触摸事件
& 触摸开始touchBegan:流星位置设置为触摸点。
& 触摸移动touchMoved:流星移动,streak跟随流星移动,形成拖尾效果。
// 触摸开始 :设置star和streak的位置
bool HelloWorld::onTouchBegan(Touch* pTouch, Event* pEvent)
// 获取触摸点位置
Vec2 pos = pTouch-&getLocation();
// 设置位置
star-&setPosition(pos);
streak-&setPosition(star-&getPosition());
// 删除所有活动条带段
streak-&reset();
// 触摸移动 :移动star和streak的位置
void HelloWorld::onTouchMoved(Touch* pTouch, Event* pEvent)
// 触摸移动的偏移量
Vec2 delta = pTouch-&getDelta();
// 设置位置
star-&setPosition(star-&getPosition() + delta);
streak-&setPosition(star-&getPosition());
3.4、运行结果
(1)设置minSeg = 50、stroke = 30、color = WHITE、纹理为steak.png。
(2)设置minSeg = 1、stroke = 10、color = RED、纹理为steak.png。
(3)关于streak-&reset() 函数。
细心的小伙伴,肯定发现了我在上面的两个GIF图片的一开始,鼠标到处点了好几下。
为什么我会做这种“无用”操作呢?因为接下来我要讲的就是我为什么乱点的原因。
我在 onTouchBegan 中写了这么一句话:streak-&reset()。
如果去掉这句话。那么每次触摸开始时,流星直接移动到触摸点,streak也跟随改变位置,就会出现如下的现象:没有触摸拖动,只是点击鼠标,也会出现拖尾划痕。
而streak-&reset()的作用就是:清除所有活动条带段。
3.5、分析与总结
& 如果minSeq和stroke设置较大,即每一段条带都比较长或宽,视觉上就会看到明显“一节一节”的那种效果。
& 如果拖尾效果不与粒子特效组合使用的话,就会像上面的例子那样,比较单调。
& MotionStreak只要改变位置,就会形成拖尾效果。无论是setPosition,还是执行动作(MoveTo、JumpTo)。
& reset() 函数可以清除当前所有存在的渐隐条带,即所谓的重置。
我只能讲到这里了,MotionStreak能发挥多大的作用,就看大家怎么用了。
希望大家都能组合成各种“酷炫”的拖尾效果。
你还没有登录,请先或!
Unity3D技术交流1群
泰课Unity3D公开课
工作时间:9:00 - 18:30
北京客服:010 -
广州客服:020 -当前位置: >
游戏武器拖尾效果 下载
时间: 15:17 来源:互联网 作者:网络 浏览:
效果如图:提取码 0549压缩包密码:unity.jb51.net
Unity之家承诺:本站所有资源免费下载,无病毒,无弹窗,无干扰链接!
免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。
猜你也喜欢看这些 ??????
其他类型的插件下载 ??????&>&&>&&>&&>&unity拖尾效果
unity拖尾效果
上传大小:255KB
unity武器拖尾效果,.先导入PocketRPG Trails的包,在武器上添加一个空物体
综合评分:0(0位用户评分)
所需积分:1
下载次数:10
审核通过送C币
创建者:daiyinglang
创建者:nigelyq
创建者:wyx100
课程推荐相关知识库
上传者其他资源上传者专辑
移动开发热门标签
VIP会员动态
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
android服务器底层网络模块的设计方法
所需积分:0
剩余积分:720
您当前C币:0
可兑换下载积分:0
兑换下载分:
兑换失败,您当前C币不够,请先充值C币
消耗C币:0
你当前的下载分为234。
unity拖尾效果
会员到期时间:
剩余下载次数:
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:using UnityE
using System.C
using System.Collections.G
//内部类 用于存储每帧光效点信息
public Vector3
public Vector3 upD
public Wp() {
public Wp(Vector3 p, float t) {
public class MyWeapon : MonoBehaviour {
private List&Wp& sections = new List&Wp&();//光效点列表
public float time = 2.0f;
public Color startColor = Color.
public Color endColor = new Color(1, 1, 1, 0);
private MeshRenderer meshR
private Material trailM
public float height = 2.0f;
private bool isPlay =
void Awake() {
MeshFilter meshF = GetComponent(typeof(MeshFilter)) as MeshF
mesh = meshF.
meshRenderer = GetComponent(typeof(MeshRenderer)) as MeshR
trailMaterial = meshRenderer.
void Start () {
// 每帧进行显示更新
void FixedUpdate()
if (isPlay)
Itterate(Time.time);
UpdateTrail(Time.time);
public void weStart() {
public void weStop() {
ClearTrail();
public void Itterate(float itterateTime) { //记录拖尾点信息
Vector3 position = transform.
float now = itterateT
// 将当前信息添加进列表
if (sections.Count == 0 || (sections[0].point - position).sqrMagnitude & 0) {
Wp section = new Wp();
section.point =
section.upDir = transform.TransformDirection(Vector3.up);//存入世界方向
section.time =
sections.Insert(0, section);
public void UpdateTrail(float currentTime) { // ** call once a frame **
// 清空mesh显示
mesh.Clear();
// 将超时点从列表移除
while (sections.Count & 0 && currentTime & sections[sections.Count - 1].time + time) {
sections.RemoveAt(sections.Count - 1);
// 两个点才能形成一个光效
if (sections.Count & 2)
//顶点 颜色 UV数组定义
Vector3[] vertices = new Vector3[sections.Count * 2];
Color[] colors = new Color[sections.Count * 2];
Vector2[] uv = new Vector2[sections.Count * 2];
//获取列表第一个点
Wp currentSection = sections[0];
// 用矩阵代替transform 性能较高
Matrix4x4 localSpaceTransform = transform.worldToLocalM
// 设置 顶点 颜色 UV信息
for (var i = 0; i & sections.C i++) {
currentSection = sections[i];
float u = 0.0f;
if (i != 0)
u = Mathf.Clamp01((currentTime - currentSection.time) / time);
// 获取朝向
Vector3 upDir = currentSection.upD
// 根据记录点 创建两个顶点
vertices[i * 2 + 0] = localSpaceTransform.MultiplyPoint(currentSection.point);
vertices[i * 2 + 1] = localSpaceTransform.MultiplyPoint(currentSection.point + upDir * height);
uv[i * 2 + 0] = new Vector2(u, 0);
uv[i * 2 + 1] = new Vector2(u, 1);
// 计算插值颜色
Color interpolatedColor = Color.Lerp(startColor, endColor, u);
colors[i * 2 + 0] = interpolatedC
colors[i * 2 + 1] = interpolatedC
// 创建三角形信息
int[] triangles = new int[(sections.Count - 1) * 2 * 3];
for (int i = 0; i & triangles.Length / 6; i++) {
triangles[i * 6 + 0] = i * 2;
triangles[i * 6 + 1] = i * 2 + 1;
triangles[i * 6 + 2] = i * 2 + 2;
triangles[i * 6 + 3] = i * 2 + 2;
triangles[i * 6 + 4] = i * 2 + 1;
triangles[i * 6 + 5] = i * 2 + 3;
// 对mesh赋值
mesh.vertices =
mesh.colors =
mesh.triangles =
public void ClearTrail() {
//清空显示对象
if (mesh != null) {
mesh.Clear();
sections.Clear();
如果您想留下此文,您可以将其发送至您的邮箱(将同时以邮件内容&PDF形式发送)
相关文章推荐
(Ctrl+Enter提交) &&
已有0人在此发表见解
&在& 01:18收藏到了
&&在信息爆炸的时代,您的知识需要整理,沉淀,积累!Lai18为您提供一个简单实用的文章整理收藏工具,在这里您可以收藏对您有用的技术文章,自由分门别类,在整理的过程中,用心梳理自己的知识!相信,用不了多久,您收藏整理的文章将是您一生的知识宝库!
· 蜀ICP备号-115753人阅读
3.3 Unity(47)
Pocket RPG Weapon Trails 武器拖尾效果
Asset Store地址:
CSDN资源地址:
由于这个插件提供的AnimationController.cs仅对Animation动画进行支持,对Animator动画支持的话需要自己实现。文档上说明实现的方式:
The WeaponTrail can be built by calling&Itterate(float itterateTime)&and&UpdateTrail(float currentTime, float deltaTime). These functions
are called by AnimationController, however if you don't want to use AnimationController you can call these yourself.
即只需要调用Itterate和UpdateTrail方法。下面使用另外的角色模型进行测试拖尾效果。
测试角色的模型包:
CSDN资源地址:
首先,在Animator窗口,创建休闲idle状态和攻击attack状态,设置它们相应的Motion,设置从idle到attack的动画参数为Attack,类型为Trigger,如下图所示:
Speed属性可以控制当前状态动作的速度。接着,创建个脚本TestMyTrail.cs附加到角色上,脚本代码如下:
using&UnityE
using&System.C
public&class&TestMyTrail&:&MonoBehaviour&{
&&&&private&Animator&
&&&&void&Start&()&{
&&&&&&&&animator&=&GetComponent&Animator&();
&&&&void&OnGUI()
&&&&&&&&if&(GUI.Button(new&Rect(0,&0,&50,&50),&&攻击&))
&&&&&&&&&&&&animator.SetTrigger(&Attack&);
运行,可以看到默认角色是休闲状态,点击按钮是攻击状态,如下图所示:
查看模型,可以看到武器是绑在右手上的,如下图所示:
给武器(Object003)添加一个子对象,命名为Trail,为其添加WeaponTrail.cs脚本、Mesh Renderer组件,材质为Pocket
RPG Trails提供的材质,设置好如下图所示:
修改TestMyTrail.cs代码为如下:
using&UnityE
using&System.C
public&class&TestMyTrail&:&MonoBehaviour&{
&&&&public&WeaponTrail&myT
&&&&private&Animator&
&&&&private&float&t&=&0.033f;
&&&&private&float&tempT&=&0;
&&&&private&float&animationIncrement&=&0.003f;
&&&&void&Start&()&
&&&&&&&&animator&=&GetComponent&Animator&();
&&&&void&LateUpdate()
&&&&&&&&t&=&Mathf.Clamp(Time.deltaTime,&0,&0.066f);
&&&&&&&&if&(t&&&0)
&&&&&&&&&&&&while&(tempT&&&t)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&tempT&+=&animationI
&&&&&&&&&&&&&&&&if&(myTrail.time&&&0)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&myTrail.Itterate(Time.time&-&t&+&tempT);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&myTrail.ClearTrail();
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&tempT&-=&t;
&&&&&&&&&&&&if&(myTrail.time&&&0)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&myTrail.UpdateTrail(Time.time,&t);
&&&&&&&&&&&&}
&&&&void&OnGUI()
&&&&&&&&if&(GUI.Button(new&Rect(0,&0,&50,&50),&&攻击&))
&&&&&&&&&&&&animator.SetTrigger(&Attack&);
将Trail对象赋给My Trail属性,如下图所示:
现在运行,可以看到休闲状态时,武器拖尾的若隐若现,如下图所示:
攻击时的效果:
要调整好Trail对象的位置、旋转等,尽量贴合武器,设置拖尾的高度,尽量与武器同长度,才能产生较好的效果。当攻击结束,武器往回收的时候,也会有拖尾,如下图所示:
如果要去掉这个时候的拖尾,可以采用更精确的控制拖尾的出现。选中攻击动作,切换到&Animations&,播放动作,在攻击开始时刻,添加一个事件,如下图所示:
在攻击完毕,也添加一个事件,如下图所示:
点击&Apply&进行应用。修改TestMyTrail.cs代码为如下:
&&&&void&Start&()&
&&&&&&&&animator&=&GetComponent&Animator&();
&&&&&&&&//&默认没有拖尾效果
&&&&&&&&myTrail.SetTime(0.0f,&0.0f,&1.0f);
&&&&public&void&heroAttack()
&&&&&&&&//设置拖尾时长
&&&&&&&&myTrail.SetTime(2.0f,&0.0f,&1.0f);
&&&&&&&&//开始进行拖尾
&&&&&&&&myTrail.StartTrail(0.5f,&0.4f);
&&&&public&void&heroIdle()
&&&&&&&&//清除拖尾
&&&&&&&&myTrail.ClearTrail();
现在运行,就会发现休闲状态时候,不会有拖尾效果,当进行攻击时,拖尾只在相应的时间点进行出现,如下图所示:
武器回收的时候,也不会有拖尾了,如下图所示:
参考资料:
1.Unity3D 武器拖尾效果(刀光) 使用PocketRPG Trails&
2.Unity3D研究院之挥动武器产生的剑痕特效(四十七)&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3004140次
积分:32067
积分:32067
排名:第127名
原创:389篇
转载:88篇
评论:3332条
联系方式:
(1)(1)(1)(1)(1)(1)(1)(1)(1)(3)(1)(1)(1)(1)(1)(1)(1)(2)(1)(1)(1)(1)(1)(3)(1)(1)(1)(1)(2)(1)(3)(3)(3)(1)(1)(3)(1)(1)(8)(1)(3)(2)(2)(3)(2)(3)(2)(1)(1)(2)(3)(6)(1)(4)(3)(1)(3)(5)(5)(5)(5)(1)(3)(5)(4)(4)(4)(5)(5)(1)(13)(11)(7)(5)(2)(5)(4)(5)(2)(7)(14)(18)(23)(19)(5)(35)(22)(21)(8)(10)(42)(49)

我要回帖

更多关于 unity 拖尾 无效果 的文章

 

随机推荐