2025年T05_unityAI跳跃球 c

T05_unityAI跳跃球 c首先创建一个 3D 项目 并给项目起一个名字 首先创建一个地面 起名为 Ground 并修改其大小 创建一个材质文件包 创建一个颜色材质 起名为 Ground 拖动拽入场景 可以调制材质棋盘格 调至 100 100 格子 接下来创建一个 3D 小球 resset 下让小球放置场景正中心

大家好,我是讯享网,很高兴认识大家。

首先创建一个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

 

 我们通过材质给墙体及障碍物涂上颜色

运行即可自动巡航

 

 

小讯
上一篇 2025-03-03 18:25
下一篇 2025-03-15 13:27

相关推荐

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