之前用ObiRope做的两个小功能,分别是绳子剪裁以及绳子拖拽。但是项目没做完,公司黄了,记录一下相关的笔记。
ObiRope下载
链接:https://pan.baidu.com/s/1D6330eonD4SALxTOJ2a_bg
提取码:hg2o
ObiRope
这个是控制绳子的生成器,需要挂在ObiSolver下进行。需要挂在目标蓝图,使用了相同蓝图,EditPath所有的ObiRope都会一起发生修改。
使用EditPath可以修改绳子的初始形状,并且这个修改不是针对单个ObiRope而是针对ObiRope使用的蓝图。
通过增加控制点,可以让绳子分成X个段落,并且控制点可以合其他组件进行联动,控制绳子样式。控制点除了控制绳子的粒子位置,还能控制粒子方向其中name是用来在Attachment下的Group的一个表示,Phase则是物理相关,相同的Phase的对象不会触发物理,而不相同的对象则会触发物理。
ThickNess控制粒子大小,表示于物理以及渲染
Resolution粒子间隔,1为0间隔。数值越小,间隔越大
PooledParticles为备用粒子,用延长绳子,而初始的粒子数则受限于你拉的控制点长度和Resolution
Obi Particle Attachment
这是一个控制绳子上粒子组固定对象的一个组件,Target为这个粒子组会放在这个Transform上,并且响应相关的效果。Static表示这个点是固定的,绳子并不会被这个东西拉动,反而会被这个东西固定起来。
如果是Dynamic的话则这个点会受到物理效果,物体的重力绳子会对这个挂在的Target产生物理效果,但是Target需要有刚体,并且刚体不是静止的。
只要一动绑上一段的的Transform就可以对绳子进行移动了
ObiCursor
这个组件可以控制绳子的伸长缩短,虽然不加的时候,拉取绳子两段的Attachment绑定的也会拉长绳子,但是这时候绳子只是被【拉伸】不是被【延长】,并且里面的粒子排布会变宽,就会造成穿透等现象。
使用Cursor,可以【延长】绳子,调用它自己的 cursor.ChangeLength(length);的方法,可以调整绳子的长短,并且这个延长,增加绳子的粒子。会在SourceMu调整粒子和CursorMu来调整绳子吐出来的地方和绳子收回去的地方。
但是这个Cursor新增的粒子会受到蓝图的PooledParticles的粒子总数控制,超过这个总数的粒子,就不会继续延长,而是变成【拉伸】
restLength = rope.restLength; //稳定下来的时候的长度
length = rope.CalculateLength(); //现在绳子的长度
element = rope.elements.Count; //element的个数
partical = rope.particleCount; //这个绳子现在有多少个粒子
绳子
通过上面参数可以获取到当前绳子的相关状况,RestLength实则为你绳子长度,除了使用cursor.ChangeLength(length)进行长度修改之外,普通的拉伸控制点距离是不会让这个数值改变的。
CalculateLength(); 这是会计算并返回现在绳子的实际长度,这个数会把你拉伸之后的长度给复制进去
element,实则是粒子组,为是一个数据结构,有这两个粒子在总一个池子里面的索引,以及他们之间的距离所组成的一个数据结构
切割
ObiRope实际上的粒子是在Solver上进行计算的,而并不是由ObiRope进行一个处理,而一般粒子都是通过Solver粒子组的所以所表示
[System.Serializable]
public class ObiStructuralElement
{
public int particle1;
public int particle2;
public float restLength;
public float constraintForce;
public float tearResistance;
}
是这样的一个数据结构。
可以通过这个段代码来遍历粒子的位置
foreach(var item in rope.elements)
{
int p1 = item.particle1;
int p2 = item.particle2;
Vector3 pos1 = rope.GetParticlePosition(p1);
Vector3 pos2 = rope.GetParticlePosition(p2);
}
可以通过上面的这个方法,找到你要断开的一个靠近的一个电,并且获取到他对应的elements
使用这个代码让绳子在指定位置断裂
rope.Tear(element) //切割指定的element并断开