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

Unity检测地面坡度丨人物上坡检测

Unity检测地面坡度

  • 前言
    • 使用
  • 代码

前言

此功能为,人物在爬坡等功能时可以检测地面坡度从而完成向某个方向给力或者完成其他操作

使用

其中我们创建了脚本GradeCalculation,把脚本挂载到人物上即可,或者有其他的使用方式,可自行拆分使用,注:其中需要修改地形的layer层级或者使用默认的就不用修改了。

代码

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;public class GradeCalculation : MonoBehaviour
{private Vector3 mLastPosition; // 上一帧的位置private Vector3 mForward; // 当前方向public float NeedleDistance = 1.0f; // 针尖距离public float NeedleHeightOffset = 1.0f; // 针尖高度偏移// Start is called before the first frame updatevoid Start(){// 在这里进行初始化}// Update is called once per framevoid Update(){// 在每一帧更新时输出坡度的读数Debug.Log("坡度的读数" + speedctr());}// 计算坡度的方法private float speedctr(){if (mLastPosition == null){mLastPosition = transform.position;}// 计算当前方向Vector3 forward = (transform.position - mLastPosition);mLastPosition = transform.position;mForward = forward.normalized;// 计算针尖位置Vector3 pos = transform.position + (mForward * NeedleDistance);pos.y += NeedleHeightOffset;float steepness = 0.0f; // 坡度值初始化// 创建射线以检测地面Ray ray = new Ray(transform.position + new Vector3(0, NeedleHeightOffset, 0), Vector3.down);RaycastHit hitCur;// 如果射线与地面碰撞if (Physics.Raycast(ray, out hitCur, 100.0f, LayerMask.GetMask("Default")))//“Default”是你的地面Layer层级名字{ray = new Ray(pos, Vector3.down);// 沿着当前方向发射射线,按距离排序var hitsForward = Physics.RaycastAll(ray, 100.0f, LayerMask.GetMask("Default")).OrderBy(h => h.distance).ToArray();if (hitsForward.Count() == 0)steepness = 0f; // 如果没有碰到地面,坡度为0else{// 计算坡度float deltaH = hitsForward[0].point.y - hitCur.point.y;float dist = (hitsForward[0].point - hitCur.point).magnitude;if (dist != 0){steepness = Mathf.Asin(deltaH / dist) / Mathf.PI * 180.0f;}}}return steepness; // 返回坡度值}
}
http://www.lryc.cn/news/270825.html

相关文章:

  • SASS循环
  • Java超高精度无线定位技术--UWB (超宽带)人员定位系统源码
  • 系列十一、解压文件到指定目录
  • PHP Swoole Client
  • 《QDebug 2023年12月》
  • sklearn 中matplotlib编制图表
  • 【Docker-Dev】Mac M2 搭建docker的redis环境
  • docker +gitee+ jenkins +maven项目 (一)
  • IDEA 开发中常用的快捷键
  • Ubuntu Desktop 死机处理
  • Hermite矩阵
  • HTML 实操试题(二)
  • MongoDB 面试题
  • LeetCode 1154. 一年中的第几天:2023年最后一道每日一题
  • 《深入理解JAVA虚拟机笔记》OutOfMemoryError 异常
  • R306指纹识别模块指令系统
  • redis的搭建及应用(三)-Redis主从配置
  • Java学习,一文掌握Java之SpringBoot框架学习文集(1)
  • javaWeb学生信息管理系统2
  • Linux Shell 019-文本行处理工具sed
  • Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷
  • 【leetcode】栈与队列总结
  • [EFI]HP Spectre 13 v102nl电脑 Hackintosh 黑苹果efi引导文件
  • 【Pytorch】学习记录分享8——PyTorch自然语言处理基础-词向量模型Word2Vec
  • 【Kotlin 】协程
  • 用Xshell连接虚拟机的Ubuntu20.04系统记录。虚拟机Ubuntu无法上网。本机能ping通虚拟机,反之不能。互ping不通
  • 人机对话--关于意识机器
  • 八股文打卡day16——计算机网络(16)
  • Java Object浅克隆深克隆
  • 概率的 50 个具有挑战性的问题 [8/50]:完美的桥牌