首先创建一个3D项目,并给项目起一个名字
首先创建一个地面,起名为Ground,并修改其大小

创建一个材质文件包
创建一个颜色材质

起名为Ground,拖动拽入场景

可以调制材质棋盘格

调至100*100格子
接下来创建一个3D小球

resset下让小球放置场景正中心
接下来我们创建几个材质做备用,分别是red,orange,yellow,green,blue
将小球y轴调至0.5使小球在地面上
除了小球身上的碰撞器以外

还要在小球身上添加刚体
如果没有导航组件可以

导入即可
接下来给小球添加导航组件(给小球添加导航组件后小球就可以通过导航寻路走路)
接下来我们调整视角 准备做障碍物

首先创建一个3Dcube

修改他的参数作为墙起名wallLeft

ctrl + d 复制 起名WallLeft
创建一个空物体,以此类推创建一个组合放进空物体里

ctrl + d 复制 一份组合空物体
小球跳的原理:跳的时候,关闭导航组件,不跳的时候,开启导航组件
接下来创建一个脚本文件夹


创建一个c#脚本起名 JumpTest

将脚本绑定小球
打开进入c#脚本将一下代码复制
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class JumpTest : MonoBehaviour
{
//实验需求:按空格键,小球向前跳跃
[SerializeField]
private float jumpForce = 20f; //力
private NavMeshAgent agent = null; //导航组件
private Rigidbody rb = null; //刚体组件引用
private bool isJumping;
private void Start()
{
agent = GetComponent<NavMeshAgent>();
rb = GetComponent<Rigidbody>();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (!isJumping) //isJumping == false
{
isJumping = true;
agent.enabled = false; //关闭导航组件
rb.AddForce(Vector3.up * jumpForce * Time.deltaTime, ForceMode.Impulse);
}
}if (transform.position.y > 3f)
{
rb.AddForce(Vector3.forward * 500 * Time.deltaTime, ForceMode.Force);
}
//说明小球已经落地了
if (isJumping && rb.velocity.y == 0)
{
isJumping = false;
agent.enabled = true;
}
}
}
再创建一个c#脚本起名为 AI

将以下代码复制
public class AI : MonoBehaviour
{
public Transform[] jumpPoints; // 跳跃点数组
private NavMeshAgent navMeshAgent; // 导航网格代理组件
private int currentJumpPointIndex; // 当前跳跃点索引
private bool isJumping; // 跳跃状态
void Start()
{
navMeshAgent = GetComponent<NavMeshAgent>(); // 获取导航网格代理组件
currentJumpPointIndex = 0; // 初始化当前跳跃点索引为0
isJumping = false; // 初始化跳跃状态为false
}
void Update()
{
if (jumpPoints.Length > 0) // 如果有跳跃点
{
navMeshAgent.SetDestination(jumpPoints[currentJumpPointIndex].position); // 设置目标点为当前跳跃点
// 检查小球是否靠近当前跳跃点
if (Vector3.Distance(transform.position, jumpPoints[currentJumpPointIndex].position) < 1f)
{
if (!isJumping) // 如果当前未处于跳跃状态
{
isJumping = true; // 设置跳跃状态为true
GetComponent<Rigidbody>().AddForce(Vector3.up * jumpForce, ForceMode.Impulse); // 对小球施加向上的跳跃力
}
}
else
{
isJumping = false; // 设置跳跃状态为false
}
if (isJumping && GetComponent<Rigidbody>().velocity.y == 0) // 如果处于跳跃状态并且垂直速度为0
{
// 切换到下一个跳跃点
currentJumpPointIndex++;
if (currentJumpPointIndex >= jumpPoints.Length)
{
// 重置跳跃点索引为0
currentJumpPointIndex = 0;
}
isJumping = false; // 设置跳跃状态为false
}
}
}
}
接下来点击
ctrl选中除地板和小球以外的障碍物体点击设置
选中地板点击设置

选中小球点击设置

接下来ctrl 选中 所有物体 点击bake烘培

烘培效果如下
选择主摄像机对齐视角
检查小球是否绑定了两个脚本+刚体+碰撞器+Nav导航组件

再创建一个空物体 作为移动停止目标

将该目标移动至障碍物之后终点处
将空物体MBy轴调至与小球同高 0.5
我们通过材质给墙体及障碍物涂上颜色

运行即可自动巡航

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/64690.html