Unity3D物体自动躲避障碍物

2023-11-20 18:40

本文主要是介绍Unity3D物体自动躲避障碍物,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 Unity版本

        2017.4.4f1

基本思路

        物体向前发射一个射线,检测到碰撞后,根据碰撞信息选择新的方向。最终结果如下。

 具体实现步骤代码

1.物体添加胶囊体碰撞组件CapsuleCollider

通过发射虚拟胶囊体来检测碰撞api

bool Physics.CapsuleCast (Vector3 point1, Vector3 point2, float radius, Vector3 direction, out RaycastHit hit, float maxDistance)

 points参数如图所示,radius是Capsule的radius,direction为当前面向,hit为碰撞信息,maxDistance为检测距离:

根据参数申请一下变量并初始化:

    //检测距离float distance = 1;//物体速度public float speed = 1;//物体下一帧面向Vector3 nexForward;//capsule端点Vector3 point1, point2;//capsule组件public CapsuleCollider capsule;// Use this for initializationvoid Start(){capsule = GetComponent<CapsuleCollider>();nexForward = transform.forward;point1 = capsule.center - new Vector3(0, 0.5f * capsule.height, 0);point2 = capsule.center + new Vector3(0, 0.5f * capsule.height, 0);}

2.申请CheckCollision函数来检测碰撞并计算下一帧的面向。

检测到碰撞点后,由碰撞点的Normal方向和物体当前面向来计算新面向。主要方法为

nexForward = Vector3.Cross(hit.normal, Vector3.Cross(transform.forward, hit.normal));

这个公式的大概意思为,计算出当前面向向量transform.forward在碰撞面上的投影向量。可以理解为:hit.normal是阳光方向,transform.forward是一个带方向的射线,得到的是射线在面上的投影射线。投影向量作为碰撞后的新方向。

(1)需要排除掉transform.forward//hit.normal的特殊情况;

(2)检测到碰撞点后,需要从碰撞点出发,用新的面向进行二次检测,防止物体卡入角落。

具体代码如下

void CheckCollision(){//动态检测距离,速度越大越需要提前检测distance = speed * Time.deltaTime;RaycastHit hit;//用于二次检测Vector3 hitPoint;//capsulecastif (Physics.CapsuleCast(transform.position + point1, transform.position + point2, capsule.radius, transform.forward, out hit, distance)){hitPoint = hit.point + capsule.radius * hit.normal;//如果朝向垂直于碰撞平面if (Vector3.Cross(transform.forward, hit.normal) == Vector3.zero){nexForward = Vector3.Cross(hit.normal, Vector3.up);}else{nexForward = Vector3.Cross(hit.normal, Vector3.Cross(transform.forward, hit.normal));}bool left = false;bool right = false;//从碰撞点起,向两边检测两边碰撞if (Physics.CapsuleCast(hitPoint + capsule.center - new Vector3(0, 0.5f * capsule.height, 0), hitPoint + capsule.center + new Vector3(0, 0.5f * capsule.height, 0), capsule.radius, nexForward, out hit, distance)){left = true;}if (Physics.CapsuleCast(hitPoint + capsule.center - new Vector3(0, 0.5f * capsule.height, 0), hitPoint + capsule.center + new Vector3(0, 0.5f * capsule.height, 0), capsule.radius, -nexForward, out hit, distance)){right = true;}if (left){if (!right){nexForward = -nexForward;}}//归一化nexForward.Normalize();}}

3.在update函数中更新物体面向,并向前移动

     // Update is called once per framevoid Update(){CheckCollision();if (nexForward != Vector3.zero)transform.forward = nexForward;transform.Translate(new Vector3(0, 0, speed * Time.deltaTime));}

这篇关于Unity3D物体自动躲避障碍物的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/396644

相关文章

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

Unity3D 运动之Move函数和translate

CharacterController.Move 移动 function Move (motion : Vector3) : CollisionFlags Description描述 A more complex move function taking absolute movement deltas. 一个更加复杂的运动函数,每次都绝对运动。 Attempts to

Shell脚本实现自动登录服务器

1.登录脚本 login_server.sh #!/bin/bash# ReferenceLink:https://yq.aliyun.com/articles/516347#show all host infos of serverList.txtif [[ -f ./serverList.txt ]]thenhostNum=`cat ./serverList.txt | wc -l`e

Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号

步骤 1:安装 Version Number Plugin 登录 Jenkins 的管理界面。进入 “Manage Jenkins” -> “Manage Plugins”。在 “Available” 选项卡中搜索 “Version Number Plugin”。选中并安装插件,完成后可能需要重启 Jenkins。 步骤 2:配置版本号生成 打开项目配置页面。在下方找到 “Build Env

以后写代码都是AI自动写了,Cursor+Claude-3.5-Sonnet,Karpathy 点赞的 AI 代码神器。如何使用详细教程

Cursor 情况简介 AI 大神 Andrej Karpathy 都被震惊了!他最近在试用 VS Code Cursor +Claude Sonnet 3.5,结果发现这玩意儿比 GitHub Copilot 还好用! Cursor 在短短时间内迅速成为程序员群体的顶流神器,其背后的原因在于其默认使用 OpenAI 投资的 Claude-3.5-Sonnet 模型,这一举动不仅改变了代码生成

在 Qt Creator 中,输入 /** 并按下Enter可以自动生成 Doxygen 风格的注释

在 Qt Creator 中,当你输入 /** 时,确实会自动补全标准的 Doxygen 风格注释。这是因为 Qt Creator 支持 Doxygen 以及类似的文档注释风格,并且提供了代码自动补全功能。 以下是如何在 Qt Creator 中使用和显示这些注释标记的步骤: 1. 自动补全 Doxygen 风格注释 在 Qt Creator 中,你可以这样操作: 在你的代码中,将光标放在

Jenkins自动构建部署项目

1. 楔子 在实际开发中,经常需要编译、静态代码检查、自动化测试、打包、部署、启动等一连串重复机械的动作,浪费时间、而且容易出错,而Jenkins就是专门Continuous integration(CI)/ Continuous Deploy(CD)开源工具,本文简单介绍Jenkins的使用。 在线无安装免费试用Jenkins:http://www.jenkins.org.cn/test

【Spring Boot】 SpringBoot自动装配-Condition

目录 一、前言二、 定义2.1 @Conditional2.2 Condition2.2.1 ConditionContext 三、 使用说明3.1 创建项目3.1.1 导入依赖3.1.2 添加配置信息3.1.3 创建User类3.1.4 创建条件实现类3.1.5 修改启动类 3.2 测试3.2.1 当user.enable=false3.2.2 当user.enable=true 3.3