Moba游戏中一些情况需要用到弧线轨迹 例如lol中皎月的Q
下面分享一种轨迹和指示器的制作思路
圆弧轨迹实际是人物、子弹绕某点进行圆周运动,
人物位置确定 技能方向dir也是定制 在设计中位移半径也是定值,当某点确定时 ,圆可确定,速度 加速度和位移时间只决定了圆的完整性 弧度对此圆的占比
所以人物 子弹 track伪代码如下
local x= 表track[1]
local y= 表track[2]
local speedx=表track[3]
local aspeedx=表track[4]
local aspeedy=表track[5]
if aspeedx==nil then
local pos=子弹位置{x,y}
local diff={x=pos.x-x,y=pos.y-y} --diff指示器弧线圆心 x,y此时为世界坐标
if diff.x==0 then
aspeedx={diff.y}
else
aspeedx = math.atan(diff.y/diff.x)
if diff.x<0 then
aspeedx=aspeedx+100
end
end
end
setCirClepos(x,y)----------定圆心 世界坐标
trackStart(x,y,aaspeedx,aspeedy)--------位移函数
track【1】
x=skillDir:x()
y=skillDir:y()
local r= 10---------------***此时圆半径出现***
x+10*x-r*2*skillDir:x()-------任意的int值修改偏移
y 加速度等同理 调试即可
指示器思路同理 三点定弧 上文圆心x,y作为指示器gameObject的子物体指示器的偏移按照上述伪代码给出的半径重新赋值即可
public class BulletVisual : MonoBehaviour
{
public float r = 3;
public float offsetX=0;
public float offsetY=0;
private void OnDrawGizmos()
{
DrawCirCle(gameObject.transform.position, r);
}
private void DrawCirCle(Vector2 center,float Radius,int VertexCount=50)
{
float deltaTheta = (2f * Mathf.PI) / VertexCount;
float theta = 0f;
Vector3 oldPos = center;
Debug.Log(oldPos);
for (int i = 0; i < VertexCount + 1; i++)
{
Vector3 pos = new Vector3(Radius * Mathf.Cos(theta)+offsetX=0, Radius * Mathf.Sin(theta)+offsetY, 0f);
Gizmos.DrawLine(oldPos, (Vector3)center + pos);//绘制方法任意
Gizmos.color = Color.red;绘制方法任意
oldPos = transform.position + pos;
theta += deltaTheta;
}
}
}
通过dir方向截取弧长绘制即可
没法粘贴出公司的绘制办法 ,下篇博客我会给出自己的代码
欢迎大家批评指正