根据 所在位置 到 目标位置,生成一系列箭头来指示路线,预制体有偏差的,需要改一些值


using System.Collections.Generic;
using UnityEngine;public class ArrowTips : MonoBehaviour
{private List<Transform> arrowList = new List<Transform>();public void CreateArrowLine(ArrowFlesh _prefab, float _size, Vector3 _startPos,Vector3 _endPos){int curIndex = 0;Vector3 curPos = _startPos;float length = _prefab.arrowLength * _size *1.5f;float distance = Vector3.Distance(_startPos, _endPos);Vector3 tempVector = _endPos - _startPos;Vector3 rot = new Vector3(0f, AngleBy2Vector3InProjectXZ(Vector3.left, tempVector));for (int a = 0; a < arrowList.Count; a++){arrowList[a].gameObject.SetActive(false);}while (true){if (distance >= length){if (arrowList.Count <= curIndex){arrowList.Add(Instantiate(_prefab, GameController.gameCtr.transform).transform);}Transform tempArrow = arrowList[curIndex];tempArrow.gameObject.SetActive(true);tempArrow.localScale = new Vector3(_size, _size, _size);tempArrow.localEulerAngles = rot;tempArrow.localPosition = curPos;curIndex += 1;curPos = NextPosPassDistanceInAngle(tempVector, curPos, length);distance -= length;}else{//可加末点大箭头break;}}}public void CreateArrowLine(ArrowFlesh _prefab, float _size, params Vector3[] _pos){int curIndex = 0;Vector3 curPos;float length = _prefab.arrowLength * _size * 1.5f;float distance; Vector3 tempVector; Vector3 rot; for (int a = 0; a < arrowList.Count; a++){arrowList[a].gameObject.SetActive(false);}for (int p = 0; p < _pos.Length - 1; p++){curPos = _pos[p];distance = Vector3.Distance(_pos[p], _pos[p + 1]);tempVector = _pos[p + 1] - _pos[p];rot = new Vector3(0f, AngleBy2Vector3InProjectXZ(Vector3.left, tempVector));while (true){if (distance >= length){if (arrowList.Count <= curIndex){arrowList.Add(Instantiate(_prefab, GameController.gameCtr.transform).transform);}Transform tempArrow = arrowList[curIndex];tempArrow.gameObject.SetActive(true);tempArrow.localScale = new Vector3(_size, _size, _size);tempArrow.localEulerAngles = rot;tempArrow.localPosition = curPos;curIndex += 1;curPos = NextPosPassDistanceInAngle(tempVector, curPos, length);distance -= length;}else{//可加末点大箭头break;}}}}public void HideArrowLine(){for (int a = 0; a < arrowList.Count; a++){arrowList[a].gameObject.SetActive(false);}}/// <summary>/// 参数是两个向量,可计算localEulaAngle的X轴/// 由两个点确定一个向量,由两个向量确定它们之间的角度/// </summary>/// <param name="_vecctorOriginal">参照向量</param>/// <param name="_vectorCheck">检测向量</param>/// <returns></returns>float AngleBy2Vector3InProjectYZ(Vector3 _vecctorOriginal, Vector3 _vectorCheck){//将向量投影到Vector3.up轴垂直的面,即X-Z面Vector3 tempVC = _vectorCheck - Vector3.Project(_vectorCheck, Vector3.right);Vector3 tempVO = _vecctorOriginal - Vector3.Project(_vecctorOriginal, Vector3.right);float angle = Vector3.Angle(tempVC, tempVO);//三维向量 点积 a*b = xa*xb + ya*yb + za*zb,a*b<0 --> 夹角在90°到180°之间,a*b=0 --> 夹角为 90°或者-90°,a*b>0 --> 夹角在0°到90°之间。float dir; //= Vector3.Dot(tempVC, tempVO) <= 0 ? -1f : 1f;float dirOC = Vector3.Dot(tempVC, tempVO);if (dirOC < 0){dir = -1;}else if (dirOC > 0){dir = 1;}else{dir = 1;Vector3 tempC2O = tempVO - tempVC;if (tempC2O.x < 0) { dir *= -1; }if (tempC2O.y < 0) { dir *= -1; }if (tempC2O.z < 0) { dir *= -1; }}angle *= dir;return angle;}/// <summary>/// 参数是两个向量,可计算localEulaAngle的Y轴/// 由两个点确定一个向量,由两个向量确定它们之间的角度/// </summary>/// <param name="_vecctorOriginal">参照向量</param>/// <param name="_vectorCheck">检测向量</param>/// <returns></returns>float AngleBy2Vector3InProjectXZ(Vector3 _vecctorOriginal,Vector3 _vectorCheck){//将向量投影到Vector3.up轴垂直的面,即X-Z面Vector3 tempVC = _vectorCheck - Vector3.Project(_vectorCheck, Vector3.up);Vector3 tempVO = _vecctorOriginal - Vector3.Project(_vecctorOriginal, Vector3.up);float angle = Vector3.Angle(tempVC, tempVO);//三维向量 点积 a*b = xa*xb + ya*yb + za*zb,a*b<0 --> 夹角在90°到180°之间,a*b=0 --> 夹角为 90°或者-90°,a*b>0 --> 夹角在0°到90°之间。float dir; //= Vector3.Dot(tempVC, tempVO) <= 0 ? -1f : 1f;float dirOC = Vector3.Dot(tempVC, tempVO);if (dirOC < 0){dir = -1;}else if (dirOC > 0){dir = 1;}else{dir = 1;Vector3 tempC2O = tempVO - tempVC;if (tempC2O.x < 0) { dir *= -1; }if (tempC2O.y < 0) { dir *= -1; }if (tempC2O.z < 0) { dir *= -1; }}angle *= dir; return angle;}/// <summary>/// 参数是两个向量,可计算localEulaAngle的Z轴/// 由两个点确定一个向量,由两个向量确定它们之间的角度/// </summary>/// <param name="_vecctorOriginal">参照向量</param>/// <param name="_vectorCheck">检测向量</param>/// <returns></returns>float AngleBy2Vector3InProjectXY(Vector3 _vecctorOriginal, Vector3 _vectorCheck){//将向量投影到Z轴正方向Vector3.forward垂直的面,即X-Z面Vector3 tempVC = _vectorCheck - Vector3.Project(_vectorCheck, Vector3.forward);Vector3 tempVO = _vecctorOriginal - Vector3.Project(_vecctorOriginal, Vector3.forward);float angle = Vector3.Angle(tempVC, tempVO);//三维向量 点积 a*b = xa*xb + ya*yb + za*zb,a*b<0 --> 夹角在90°到180°之间,a*b=0 --> 夹角为 90°或者-90°,a*b>0 --> 夹角在0°到90°之间。float dir; //= Vector3.Dot(tempVC, tempVO) <= 0 ? -1f : 1f;float dirOC = Vector3.Dot(tempVC, tempVO);if (dirOC < 0){dir = -1;}else if (dirOC > 0){dir = 1;}else{dir = 1;Vector3 tempC2O = tempVO - tempVC;if (tempC2O.x < 0) { dir *= -1; }if (tempC2O.y < 0) { dir *= -1; }if (tempC2O.z < 0) { dir *= -1; }}angle *= dir;return angle;}/// <summary>/// 坐标o指向坐标t的向量1 = 末-始,归一化后 乘 任意向量模 得到的向量2与向量1方向相同,/// 加 坐标o后仍为向量1指向的方向上的点/// 注:坐标可当成起始点为(0,0)的向量/// 推导: Pt-Po=v1 , v2=N(v1)*m, x-Po=v2 ,=> x=Po+v2 /// </summary>/// <param name="_angle"></param>/// <param name="_curPos"></param>/// <param name="_length"></param>/// <returns></returns>Vector3 NextPosPassDistanceInAngle(Vector3 _angle, Vector3 _curPos, float _length){return (_curPos + Vector3.Normalize(_angle) * _length);}}

路线指示箭头的生成——两个Vector3计算Distance,Rotation相关推荐

  1. CSS实现空心三角指示箭头

    web开发中,三角形的日常应用,以三角形指示箭头最为常见,其用CSS来实现非常简单,熟悉了之后相比于引入SVG或是背景图片会是更好更灵活的选择. 而三角箭头一般而言,又分为两种,一种是视觉上没有边框的 ...

  2. python中文昵称-python3随机生成中文字符(随机生成两字或三字的名字)

    第一种方法:Unicode码 在unicode码中,汉字的范围是(0x4E00, 9FBF) import random def Unicode(): val = random.randint(0x4 ...

  3. [原创]物探小宽线坐标快速生成(平行线坐标互算 、点到线距离计算、两线交点计算等)...

    界面如下: 下载地址:CSDN 功能简介: 主要是解决并简化各项目中坐标(特别是是斜测线坐标方程组)的重复脑残计算问题,降低脑残机率,为懒而生 1.对于斜线.规则线坐标理论快速生成等 2.两线交点的标 ...

  4. android实现箭头流程列表_Android下拉列表选项框及指示箭头动画

    android原生的Spinner提供了下拉列表选项框,但在一些流行的APP中,原生的Spinner似乎不太受待见,而通常会有下图所示的下拉列表选项框: 初始化状态: 点击弹出下拉选择选项框: 选中后 ...

  5. html上下箭头动态效果,使用CSS和Bootstrap图标制作上下跳动的指示箭头动画效果...

    有时侯页面很长,需要指示箭头告诉用户下面还有东西.可以用纯CSS的方法实现. HTML:添加一个链接,可修改锚点点击时滑动到指定位置,这里使用了Bootstrap 3.x版本的一个向下箭头作为图标. ...

  6. html怎么做向下的图标,用CSS和Bootstrap图标制作上下跳动的指示箭头动画效果

    有时侯页面很长,需要指示箭头告诉用户下面还有东西.可以用纯CSS的方法实现. HTML:添加一个链接,可修改锚点点击时滑动到指定位置,这里使用了Bootstrap 3.x版本的一个向下箭头作为图标. ...

  7. css 让图标上下跳,使用CSS和Bootstrap图标制作上下跳动的指示箭头动画效果

    有时侯页面很长,需要指示箭头告诉用户下面还有东西.可以用纯CSS的方法实现. HTML:添加一个链接,可修改锚点点击时滑动到指定位置,这里使用了Bootstrap 3.x版本的一个向下箭头作为图标. ...

  8. Java生成两个圆判断是否重叠,用java随机画出两个圆,判断它们是不是相交

    用java随机画出两个圆,判断它们是否相交 import java.awt.*; import java.util.Random; import javax.swing.*; import javax ...

  9. 生成两组相互独立服从标准正态分布的随机数(推导过程)

    生成两组相互独立服从标准正态分布的随机数(推导过程) 预备知识:均匀分布的特殊地位 生成两组独立的服从标准正态分布的随机数 预备知识:均匀分布的特殊地位 设 F ( x ) F(x) F(x)满足:( ...

最新文章

  1. js php滚动图代码,JavaScript_JS实现的N多简单无缝滚动代码(包含图文效果),本文实例讲述了JS实现的N多简 - phpStudy...
  2. 【opencv】25.图像卷积cv::filter2D()以及c++代码实例
  3. HBase timestamp(version)
  4. OpenGL Assimp模型加载库
  5. jrebel不能使用ajax,Jrebel不生效的原因和解决办法
  6. CubeMx 生成的FreeRTOS 代码在ARM compiler6 编译__forceinline 报错的解决方法
  7. Alter操作(修改列名,修改列数据类型,增加列,删除列,增加列且设为主键及对默认值操作)
  8. WPF 如何在代码中使用自定义的鼠标资源
  9. 【赠书】当深度学习遇上图: 图神经网络的兴起!
  10. lol最克制诺手的英雄_LOL“英雄恐惧症”,当你上单遇到诺手时,你会用什么英雄对线...
  11. 为了有利于保护安全性,IE已限制此网页运行可以访问计算机的脚本或 ActiveX 控件。请单击这里获取选项......
  12. AngularJS------Error: Cannot find module '@angular-devkit/core'
  13. Android万能布局检查器UI Automator Viewer使用教程、环境配置和Mac无法打开问题解决(uiautomatorviewer,android studio,layer,查看,错误)
  14. element-ui 导航栏三级
  15. 00023 自考高等数学
  16. 钉钉如何实现原笔迹手写签批
  17. java收割者模式,王牌战士收割者怎么玩 海拉技巧玩法介绍
  18. 游建慧:大山铺镇侧卧恐龙身畔的烟火人间骇伦
  19. [易飞]一张领料单单身仓库飞了引起的思考
  20. C语言中*p++ ,(*p)++ ,*++p ,++*p的区别

热门文章

  1. WinMerge文字重叠问题
  2. linux 杂项设备,浅谈 MISC杂项设备
  3. ssm毕设项目焦虑自测与交流平台k43cf(java+VUE+Mybatis+Maven+Mysql+sprnig)
  4. 第十一届蓝桥杯大赛软件类决赛(C/C++ 大学A组)
  5. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
  6. 高铁对合肥及周边城市可达性及商业腹地变化影响研究
  7. buildroot制作树莓派CM3的系统
  8. raspberry pi cm3+的i2c使用的问题调试
  9. Raspberry Pi 3安装配置Raspbian过程
  10. HOJ 1276 士兵队列训练问题(stl, 水题)