通过LineRenderer画线使玩家跟随线条移动

using Cinemachine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreatLine : MonoBehaviour
{
public CinemachineVirtualCamera cam;
public LineRenderer line;
public GameObject airplane;
public float speed = 1;
Queue<Vector3> que = new Queue<Vector3>();
Vector3 pos;
float time;
float startime;
// Start is called before the first frame update
void Start()
{
pos = airplane.transform.position;//保存飞机坐标初始值
que.Enqueue(airplane.transform.position);//将飞机初始值加入队列
}

// Update is called once per frame
void Update()
{

if (Input.GetMouseButton(0))
{
Vector3 pp = Camera.main.WorldToScreenPoint(airplane.transform.position);//把飞机的世界坐标转成屏幕坐标
Vector3 ppp = new Vector3(Input.mousePosition.x, Input.mousePosition.y, pp.z);//这是一个由鼠标在屏幕上的x,y和飞机在屏幕上z轴的点构成的v3坐标
Vector3 p = Camera.main.ScreenToWorldPoint(ppp);//将这个v3坐标再从新转成世界坐标
que.Enqueue(p);//加入队列 先进先出 从开始的第一个点开始
line.positionCount = que.Count;//lineRenderer的端点数量等于队列长度
line.SetPositions(que.ToArray());//设置端点

}
else if (Input.GetMouseButtonUp(0))
{
PlaneMove();
cam.Priority = 12;
cam.Follow = airplane.transform;
cam.LookAt = airplane.transform;
}
if (pos != airplane.transform.position)//当飞机现在 的位置不等于初始坐标
{
airplane.transform.position = Vector3.Lerp(airplane.transform.position, pos, (Time.time - startime) / time);
line.positionCount = que.Count;
line.SetPositions(que.ToArray());

}
else if (que.Count > 0)//当队列中的端点数大于0将一直执行
{
PlaneMove();
}
}
public void PlaneMove()
{
pos = que.Dequeue();//每执行一次进行一次出队
startime = Time.time;
time = Vector3.Distance(airplane.transform.position, pos) / speed;
}
}

 

posted @   陈晨111  阅读(137)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示