赞
踩
首先创建一个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
将以下代码复制
using UnityEngine;
using UnityEngine.AI;
public class AI : MonoBehaviour
{
public Transform[] jumpPoints; // 跳跃点数组
private NavMeshAgent navMeshAgent; // 导航网格代理组件
private int currentJumpPointIndex; // 当前跳跃点索引
private bool isJumping; // 跳跃状态
[SerializeField]
private float jumpForce = 5f; // 跳跃力
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
我们通过材质给墙体及障碍物涂上颜色
运行即可自动巡航
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。