google-code-export / colonist

Automatically exported from code.google.com/p/colonist
0 stars 1 forks source link

Decal system #17

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
需要设计一套Decal系统.
Decal就是游戏中出现的各种弹孔,血迹.
例如,当Predator爪伤了一个人类士兵,地上就要生成一些血迹.
Decal system 的要求是:
1. 事件驱动.当LevelManager接收到GameEventType = 
NPCReceiveDamage的时候创建Decal对象.
2. 可以在 
Inspector中配置不同的单位对应的Decal对象.人类是流血,机器人�
��流油,怪物嘛就是一滩绿色的液体.
3. 
性能要好,每个Decal的创建和销毁要能在Inspector中配置.当游戏�
��物离开了某个区域的时候,会自动销毁在那个区域里面的Decal
.

Original issue reported on code.google.com by yinyuanq...@gmail.com on 23 Dec 2012 at 9:39

GoogleCodeExporter commented 9 years ago
粗略的实现了一下血迹功能

-- 1. 事件驱动.当LevelManager接收到GameEventType = 
NPCReceiveDamage的时候创建Decal对象.
对于这个,似乎要用GameEvent去做的话,只能 
改写LevelManager.GameEvent或者在ScenEventListener里面写(不过这个deca
l 
system应该和特定scene,level没有什么关系吧...),可能还缺少DamageP
arameter(如果damagePoint比较大的话,是不是应该有更大量的bloodstr
eam)

-- 2.......
这个可能要在加一个脚本到prefab里面(大概见图),攻击到可以��
�血的单位时候,就按设定好的效果执行(流血/油/绿色液体啊)

-- 3....
这个OnBecameInvisible()事件就能做到了,需要注意的是disable那些��
�必要的camera

Original comment by lightnin...@gmail.com on 26 Dec 2012 at 2:37

GoogleCodeExporter commented 9 years ago
木有图啊...

Original comment by yinyuanq...@gmail.com on 27 Dec 2012 at 3:20

GoogleCodeExporter commented 9 years ago
呃,忘了,大概就是这些内容
可能需要增加 血迹的落地点 这样的设置
(不同的粒子效果喷出来的血,可能会有不同的落地点把...)

Original comment by lightnin...@gmail.com on 27 Dec 2012 at 3:35

Attachments:

GoogleCodeExporter commented 9 years ago
-- 可能需要增加 血迹的落地点 这样的设置

这个落地点,是需要动态计算出来的.
流程:
1. 事件触发
2. 获取受到伤害单位的WORLD POSITION
3. 计算出创建Decal 对象的地面,和墙壁点,计算方式见图.

接下来要解决的问题是,如果单位站在墙角,随机选出来的落地
点又飞到场景之外了,如何避免这种情况?

Original comment by yinyuanq...@gmail.com on 27 Dec 2012 at 4:31

Attachments:

GoogleCodeExporter commented 9 years ago
喷血效果总不会只有一个吧?而且落地点应该是依赖于所使用�
��粒子效果的吧
比如Blood_Pack里面的Splash03粒子效果就是比Splash04小那么一点(��
�血最远距离)
(我意思是,增加落点这样的方法比较简便,就是要自己检测一��
�落点位置而已.
当然,写一个函数来适应不同的粒子效果也可以,对性能影响应
该不大)

另外,
喷的方向和落点不应该是随机的吧,从哪儿攻击就在哪儿流血�
��对吧..
玩家角色(Predator)的GameEventType.PlayerReceiveDamage似乎从来没用过 

Original comment by lightnin...@gmail.com on 27 Dec 2012 at 5:24

GoogleCodeExporter commented 9 years ago
--1. 
喷血效果总不会只有一个吧?而且落地点应该是依赖于所使用�
��粒子效果的吧
--2. 
喷的方向和落点不应该是随机的吧,从哪儿攻击就在哪儿流血�
��对吧..

1. 喷血效果需要配置, 
喷血效果对应的Decal效果也是需要配置,但是产生Decal的位置肯
定是需要计算.

2. 方向可以配置,落点是在围绕单位的一个圆内的某一点. 
你要考虑的计算函数生成DECAL的问题. 如何在地上产生DECAL? 
如果单位靠近墙,如何在墙上产生DECAL ??

Original comment by yinyuanq...@gmail.com on 27 Dec 2012 at 5:48

GoogleCodeExporter commented 9 years ago
使用http://u3d.as/content/edelweiss-interactive/decal-system/36o
这个DECAL SYSTEM做了一个小DEMO

Original comment by lightnin...@gmail.com on 30 Dec 2012 at 5:34

Attachments:

GoogleCodeExporter commented 9 years ago
这个DECAL SYSTEM有一些小问题

1.生成的DECAL可能仅仅是某个当前位置看起来没问题
(由于这个系统是使用Projector来投射材质然后决定所切MESH的大
小)

2.Projector的设置ProjetorOffset要适应DecalScale
见图2,3
(图3的设置其实还是有问题的..)

Original comment by lightnin...@gmail.com on 30 Dec 2012 at 8:11

Attachments:

GoogleCodeExporter commented 9 years ago
现在AI架构好像已经把溅血效果做了,而且也没有给LevelManager��
�递事件.
现在与effectdata合并一下
改动如图,代码在google drive

Original comment by lightnin...@gmail.com on 6 Jan 2013 at 2:38

Attachments:

GoogleCodeExporter commented 9 years ago
噢,忘了说,这个直接在Inspector里面配置(AIEditor似乎还不行?)
要改的就是CreateDecalAfterEffect和Decal里面的DecalMaterial

我这里使用的material是自己弄的

Original comment by lightnin...@gmail.com on 6 Jan 2013 at 2:49

Attachments:

GoogleCodeExporter commented 9 years ago

Original comment by yinyuanq...@gmail.com on 7 Jan 2013 at 9:13

GoogleCodeExporter commented 9 years ago
Jeffery,col.apk无法安装,另外,请把整个场景导出成unitypackage上传
(不仅仅是代码)

Original comment by yinyuanq...@gmail.com on 7 Jan 2013 at 11:34

GoogleCodeExporter commented 9 years ago
我的导出unitypackage好像会出错,而且我update新代码的时候好像�
��出现missing monobehavior的问题...
你说的col.apk好像是之前那个旧的是把

Original comment by lightnin...@gmail.com on 7 Jan 2013 at 11:37

GoogleCodeExporter commented 9 years ago
另外,这个decal 
system,我虽然还没有完全看完它的全部内容,但是我感觉它不是
很专业,至少比不上A*寻址. 
首先是文档有点乱,看Reference.pdf看完了不知道怎么上手,怎么��
�头开始创建一个可用的decal, 
另外使用RectangleProjector投射的方式创建decal,有些复杂. 
(似乎还有其它的方式,还没有看完)

其实创建decal应该是一个很简单的过程,本质无非就是在一个��
�定的平面上创建一个物体. 
我想重新导向一下decal系统的思路.

Original comment by yinyuanq...@gmail.com on 7 Jan 2013 at 11:39

GoogleCodeExporter commented 9 years ago
恩,确实
我也是看example才知道怎么做的,而且我觉得projector有点多余的
样子

等会我再发一个包,里面包含.apk,还有script,场景也有(不建议覆
盖原来的,我这里的环境貌似有点问题的)

Original comment by lightnin...@gmail.com on 7 Jan 2013 at 12:51

GoogleCodeExporter commented 9 years ago
DecalSystem更新.

1. Decal现在已经加入到AI框架中.新增DecalData类.
一个DecalData会在ReceiveDamageData中被引用,引用结构和EffectData相�
��.

public class DecalData
{
    public string Name = string.Empty;

#region use global decal object
    public bool UseGlobalDecal = true;
    public GlobalDecalType GlobalType = GlobalDecalType.HumanBlood_Splatter01_Static;
#endregion

#region use custom decal object
    /// <summary>
    /// An array here. Randomly select one when creating.
    /// </summary>
    public Object[] DecalObjects = new Object[]{};
    /// <summary>
    /// ProjectDirection:
    /// Vertical = Decal create on ground.
    /// Horizontal = Decal create on wall.
    /// </summary>
    public HorizontalOrVertical ProjectDirection = HorizontalOrVertical.Vertical;
    /// <summary>
    /// if DestoryInTimeOut = true, the EffectObject will be destory in %DestoryTimeOut% seconds.
    /// </summary>
    public bool DestoryInTimeOut = true;
    public float DestoryTimeOut = 30;
    public float ScaleRate = 1;
    public LayerMask ApplicableLayer;
#endregion
}

2. 
在使用AIEditor编辑AI单位的过程中,我觉得要求设计者给任何一
个单位都定义一次流血Effect和Decal非常麻烦,例如两个单位都��
�人类士兵,流血效果和Decal其实都是一样的,当时却要分别创建
两次. 
所以这里引入了GlobalBloodEffectDecalSystem类,这个类专门用于创建
全局预定义好的特效和Decal.需要注意的是,它仅仅负责那种由�
��害造成的Decal. 如果一个DecalData的UseGlobalDecal 
字段为TRUE,则代表它使用全局Decal,否则则会创建单位自定义的
Decal.

对应的代码已经提交.

Original comment by yinyuanq...@gmail.com on 9 Jan 2013 at 12:56

Attachments:

GoogleCodeExporter commented 9 years ago
目前的Decal应该已经满足需要了,Marked close

Original comment by yinyuanq...@gmail.com on 11 Jan 2013 at 12:05