当前位置: 首页 > news >正文

济南网站备案合肥网站优化推广方案

济南网站备案,合肥网站优化推广方案,石家庄建设银行网点,wordpress 邮件服务器前言 在一些射击类的游戏中,经常会有一些类似炮台的武器,可以上下左右旋转,对目标进行瞄准。又或者是人物身上的枪支,在准心转动的时候,保持着武器朝向准心的方向。本篇简单的进行了效果的实现,如下图&…

前言

在一些射击类的游戏中,经常会有一些类似炮台的武器,可以上下左右旋转,对目标进行瞄准。又或者是人物身上的枪支,在准心转动的时候,保持着武器朝向准心的方向。本篇简单的进行了效果的实现,如下图:

首先需要了解下有关pitch,yaw,roll的含义

pitch是围绕X轴旋转,也叫做俯仰角(武器上下转动),如图:

yaw是围绕Y轴旋转,也叫偏航角(武器左右转动),如图:

roll是围绕Z轴旋转,也叫翻滚角,如图:

根据需求,我们一般只需要实现武器的pitch和yaw旋转即可,来达到瞄准指定位置的效果。

思路

首先类似于炮台,一般炮身和炮管会分开转动,比如炮身只可左右转动(yaw),炮管上下转动(pitch)。我们需要两个Transform来分别控制旋转,其中炮管要作为炮身子控件。但是枪支那种一般就不会分成两个控件,所以我们把两个Transform同时指向同一控件即可。同时再用一个Transform指向瞄准物,同时我们可以设置一些最大旋转角度限制。

需求1,武器一直瞄准瞄准物,但是当瞄准物在武器身后的时候不进行瞄准处理:可以计算武器到瞄准物和武器正前方直接的夹角,若夹角<90度,即做瞄准操作,否则则不处理。

需求2,yaw旋转:即根据Y轴旋转,eulerAngles.y进行变动,物体呈左右转动之势。因为是左右旋转,所以我们可以忽略武器和瞄准物的Y轴高度差距,使两者在同一高度的情况下(可以使用Vector3.ProjectOnPlane,将武器到瞄准物的向量映射到武器的xz平面上),计算武器forward的向量和武器到瞄准物的向量之间的夹角,若夹角为0则已瞄准,否则则改动eulerAngles.y的值,使Transform.forward变动,从而让夹角为0。(我们可以利用向量的叉乘Vector3.Cross,来判断两个向量之间的左右关系

需求3,picth旋转:基本和yaw旋转同理,只是改变的是eulerAngles.x的值。

实现

直接上代码,绑定在武器的父节点GameObject上,绑定好对应关联即可

using UnityEngine;public class AutoRotationGun : MonoBehaviour
{//最大旋转角度限制public int MaxPitchAngle = 60;public int MaxYawAngle = 60;//旋转速度public int Speed = 20;//pitch转动的物体public Transform PitchTransform;//yaw转动的物体public Transform YawTransform;//瞄准物public Transform TargetTransform;Vector3 mPitchTarget, mYawTarget;float mCurrentPitchAngle, mCurrentYawAngle;Transform mTransform;float mPitchAngleOffset, mYawAngleOffset, mAimAngleOffset;Vector3 mPitchCross, mYawCross;void Start(){mTransform = transform;}void Update(){if (TargetTransform != null && IsCanAim()){//旋转不使用PitchTransform.Rotate(x,y,z),防止z轴的变化if (PitchTransform == YawTransform){PitchTransform.localEulerAngles = new Vector3(PitchRotation(Speed * Time.deltaTime), YawRotation(Speed * Time.deltaTime), 0);}else{PitchTransform.localEulerAngles = new Vector3(PitchRotation(Speed * Time.deltaTime), 0, 0);YawTransform.localEulerAngles = new Vector3(0, YawRotation(Speed * Time.deltaTime), 0);}}
#if UNITY_EDITORDebug.DrawRay(PitchTransform.position, PitchTransform.forward * 100, Color.red);
#endif}bool IsCanAim(){//武器到瞄准物的向量与武器的正前面的夹角在90度以内才可瞄准if (PitchTransform != null && YawTransform != null){//mAimAngleOffset = Mathf.Acos(Vector3.Dot(transform.forward, (TargetTransform.position - PitchTransform.position).normalized)) * Mathf.Rad2Deg;mAimAngleOffset = Vector3.Angle(mTransform.forward, TargetTransform.position - PitchTransform.position);if (mAimAngleOffset < 90){return true;}}return false;}float PitchRotation(float speed){//当前旋转角度mCurrentPitchAngle = PitchTransform.localEulerAngles.x;if (mCurrentPitchAngle > 180){mCurrentPitchAngle = -(360 - mCurrentPitchAngle);}//武器到瞄准物的向量,映射到武器的yz屏幕上的法向量mPitchTarget = Vector3.ProjectOnPlane(TargetTransform.position - PitchTransform.position, PitchTransform.right).normalized;//计算当前瞄准方向与预期方向的夹角。大于精度则需要pitch转动来调整mPitchAngleOffset = Vector3.Angle(PitchTransform.forward, mPitchTarget);if (mPitchAngleOffset == 0) {return mCurrentPitchAngle;}if (mPitchAngleOffset < speed) {speed = mPitchAngleOffset;}//计算两个向量的叉乘,用于判断向量的左右关系mPitchCross = Vector3.Cross(mPitchTarget, PitchTransform.forward).normalized;if (mCurrentPitchAngle > -MaxPitchAngle && mPitchCross == PitchTransform.right) {return mCurrentPitchAngle - speed;}else if (mCurrentPitchAngle < MaxPitchAngle && mPitchCross != PitchTransform.right) {return mCurrentPitchAngle + speed;}return mCurrentPitchAngle;}float YawRotation(float speed){mCurrentYawAngle = YawTransform.localEulerAngles.y;if (mCurrentYawAngle > 180){mCurrentYawAngle = -(360 - mCurrentYawAngle);}mYawTarget = Vector3.ProjectOnPlane(TargetTransform.position - YawTransform.position, YawTransform.up).normalized;mYawAngleOffset = Vector3.Angle(YawTransform.forward, mYawTarget);if (mYawAngleOffset == 0) {return mCurrentYawAngle;}if (mYawAngleOffset < speed) {speed = mYawAngleOffset;}mYawCross = Vector3.Cross(mYawTarget, YawTransform.forward).normalized;if (mCurrentYawAngle > -MaxYawAngle && mYawCross == YawTransform.up) {return mCurrentYawAngle - speed;}else if (mCurrentYawAngle < MaxYawAngle && mYawCross != YawTransform.up) {return mCurrentYawAngle + speed;}return mCurrentYawAngle;}
}

 

http://www.rdtb.cn/news/2703.html

相关文章:

  • 网站模板下载简单的那种手机百度app
  • 嘉兴网嘉兴网站建设杭州网站关键词排名优化
  • 扁平化设计 科技感网站素材seo外链推广工具下载
  • 三级分销网站建设营销推广seo
  • 福州网站怎么做的贵州seo技术查询
  • 邢台建设局网站哈尔滨网站优化流程
  • 做网站找个人还是公司网站开发软件
  • 微信上微网站怎么做的吗武汉网站建设公司
  • 怎样看出一个网站是那个公司做的东莞疫情最新消息今天新增病例
  • 企业网站建立流程的第一步是哈尔滨优化网站方法
  • wordpress 仿站谷歌浏览器最新版本
  • 帮做网站的seo推广案例
  • 查询工具类网站制作武汉seo网站优化排名
  • 高密做网站哪家好代理优化设计
  • 自己做网站 需要会什么6seo挖关键词
  • 微信做网站的弊端seo推广是什么意思呢
  • 找人做一下网站大概多少钱深圳百度代理
  • 益阳做网站怎么便宜重庆seo博客
  • 烟台企业做网站推广网站源码
  • 电子产品网站建设策划seo标题关键词优化
  • 免费单页网站建设深圳网络营销策划
  • 乐清建设路小学校园网站seo标题优化裤子关键词
  • 广东网站建设系统外贸网站seo教程
  • 宿迁做网站优化seo视频教程汇总
  • 做网站美工的前途怎么样百度网盘搜索引擎入口官网
  • 衡水网站建设2022年传销最新消息
  • dw做视频网站百度公司推广
  • 软件技术的发展前景seo教程免费分享
  • 华为云服务器怎么做网站国外十大免费服务器和域名
  • 重庆网站建设最大如何加入广告联盟赚钱