unity中2D的刚体也是存在向下的重力效果,在添加一定的力量的作用下就可以形成一个弧度的投射,然后在通过定义一个集合存放一个图片,将集合中的图片在力量所经过的路径上一次赋值,就会形成一个有弧度的抛物线,通过鼠标的拉扯,可以形成不同的力,显示出不同的抛物线弧度效果,下图则是效果的一个展现。
此效果的实现则是刚体加力后将力进行计算一次赋值给存放集合中的每一个物体后形成的效果。
以下则是我使用的代码:
public Rigidbody2D rg;
public void zuoyongli(Vector2 lo)
{
rg.AddForce(lo,ForceMode2D.Impulse);//利用Rigidbody2D作用力物体
}
这个是给物体的代码只需要将物体身上的刚体赋值给rg则可以了。
public bar _bar;//物体身上的代码
public Camera _main;
public tir _tir;//存放集合的一个代码
private bool m_isDragging;
private Vector2 m_StartPosition;
private Vector2 m_EndPositioin;
private float logo;
private Vector2 lixiangliang;
private Vector2 fangxiang;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
m_isDragging = true;
OnDragStart();
}
if (Input.GetMouseButtonUp(0))
{
m_isDragging = false;
OnDragEnd();
}
if (m_isDragging)
{
OnDrag();
}
}
/// <summary>
/// 按下左键后
/// </summary>
private void OnDragStart()
{
m_StartPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
_tir.Show();
}
/// <summary>
/// 持续按下左键
/// </summary>
private void OnDrag()
{
m_EndPositioin= Camera.main.ScreenToWorldPoint(Input.mousePosition);//赋值鼠标当前位置
logo = Vector2.Distance(m_StartPosition, m_EndPositioin);//计算两者之间的距离
fangxiang = (m_StartPosition - m_EndPositioin).normalized;
lixiangliang = fangxiang * logo * 4f;//计算作用力大小
_tir.updatefather(_bar.transform.position, lixiangliang);//给抛物线赋值
}
/// <summary>
/// 抬起后
/// </summary>
private void OnDragEnd()
{
_bar.zuoyongli(lixiangliang);//将作用力赋值到物体上
_tir.Hide();
}
以上代码则是赋值给一个空物体,然后将物体与存放集合的空对象赋值则可以。
public GameObject father;//本物体下定义一个空物体用来统一管理显示影藏
public GameObject yu;//抛物线上每一个的预制体
public Transform[] tran = new Transform[20];
private Vector2 m_pos;
private float m_time;
// Start is called before the first frame update
void Start()
{
float max = 1;
float targer = max / tran.Length;//计算每个的大小
for (int i = 0; i < tran.Length; i++)
{
var go = Instantiate(yu).transform;
go.parent = father.transform;//实例化后设置父级
go.localScale = Vector3.one * max;
if(max>0.1f)
{
max -= targer;
}
tran[i] = go;//赋值集合
}
Hide();
}
/// <summary>
/// 调用抛物线函数
/// </summary>
/// <param name="birdPos">物体所在的位置</param>
/// <param name="pushSpeed">作用力</param>
public void updatefather(Vector2 bird, Vector2 push)
{
m_time = 0.1f;
for (int i = 0; i < tran.Length; i++)//所有的抛物线上的物体的位置挨个赋值
{
m_pos.x = (bird.x + push.x * m_time);
m_pos.y = (bird.y + push.y * m_time) - 0.5f * Physics2D.gravity.magnitude * m_time* m_time;
tran[i].position = m_pos;
m_time+= 0.1f;
}
}
/// <summary>
/// 显示轨迹
/// </summary>
public void Show()
{
father.SetActive(true);
}
/// <summary>
/// 隐藏预测轨迹
/// </summary>
public void Hide()
{
father.SetActive(false);
}
将该代码赋值给存放集合的空物体则可以
这个是要投射的物体的组件设置
这个是集合存放的空物体的设置,不需要然后组件
这个是两者之间的一个空物体的设置,也不需要组件的加载,还有一些赋值,还有最关键的一个就是相机中组件的设置,不然会造成鼠标位置的一些误差。
将相机中这个设置后之后可以避免一些不必要的bug。
这样这个抛物线就做好了。