首页 > 其他分享 >『功能项目』骑乘坐骑【22】

『功能项目』骑乘坐骑【22】

时间:2024-09-04 20:24:51浏览次数:13  
标签:坐骑 22 骑乘 transform agent Player GetComponent playerObj

我们打开上一篇21项目优化的项目,

本章要做的事情是在召唤坐骑后的指定距离内点击骑乘即可乘坐坐骑

首先进入坐骑熊的预制体空间,将主角模型拖拽至坐骑身上并删除所有组件及标签

将子物体Player拖拽至其子级,父类删掉

将其Player隐藏

创建坐骑的动画控制器MountBearAC

创建参数IsIdle

设直线

设置返回线

将新建动画控制器MountBearAC拖拽至坐骑熊对象的动画控制器框选上

对坐骑熊增加一个NavMeshAgent组件,并修改标签为Player

(这里标签设置为Player的原因是当主角骑乘后会激活坐起身上隐藏的主角模型并隐藏本身主角Player,所以该标签设置为Player)

创建一个脚本:RidingMountMoving.cs

编写脚本:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.AI;
using UnityEngine.EventSystems;
public class RidingMountMoving : MonoBehaviour{
    bool isInMount;
    Vector3 mountPos;
    Animator animator;
    GameObject playerObj;
    Transform mount;
    NavMeshAgent agent;
    Button callBtn;
    CameraCtrl cameraCtrl;
    void Start(){
        isInMount = false;
        animator = GetComponent<Animator>();
        playerObj = GameObject.Find("PlayerNormal(Clone)").gameObject;
        mount = GetComponent<Transform>();
        agent = mount.GetComponent<NavMeshAgent>();
        cameraCtrl = Camera.main.GetComponent<CameraCtrl>();
        callBtn = GameObject.Find
            ("Canvas/MountUI/Image/RideBtn").GetComponent<Button>();
        callBtn.onClick.AddListener(OnCallButton);
    }
    public void OnCallButton(){
        if (isInMount){
            animator.SetBool("IsIdle", true);
            isInMount = false;
            mountPos = transform.position;
            playerObj.transform.position = mountPos + Vector3.right * 2f;
            Camera.main.GetComponent<CameraCtrl>().player = playerObj.transform;
            transform.Find("Armature/Root_M/Spine1_M/Player").gameObject.SetActive(false);
            playerObj.transform.gameObject.SetActive(true);
            agent.speed = 3.5f;
        }
        else{
            if (Vector3.Distance(transform.position, playerObj.transform.position) < 5f){
                isInMount = true;
                GameObject.Find("PlayerNormal(Clone)").SetActive(false);
                transform.Find("Armature/Root_M/Spine1_M/Player").gameObject.SetActive(true);
                cameraCtrl.player = transform;
                animator.SetBool("IsIdle", false);
                agent.speed = 6.5f;
            }
        }
    }
    void FixedUpdate(){
        // 检查代理是否到达了目的地
        if (agent.pathStatus == NavMeshPathStatus.PathComplete &&
            agent.remainingDistance <= agent.stoppingDistance){
            // 到达目的地,停止跑步动画,播放停止动画
            animator.SetBool("IsIdle", true);
        }
    }
    void Update(){
        if (EventSystem.current.IsPointerOverGameObject())
            return;
        if (Input.GetMouseButtonDown(0)){
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit)){
                animator.SetBool("IsIdle", false);
                agent.SetDestination(hit.point);
            }
        }
    }
}

将脚本挂载至坐骑熊预制体上

优化:(让主角在骑乘坐骑时点击取消坐骑失效)

修改脚本:CallOrHideMount.cs

优化:(让主角在下坐骑时停止移动)

运行项目 - 点击召唤坐骑后骑乘效果

本篇做了前十篇文章的项目优化,接下来还需做以下内容:

1.可拖动UI窗口

2.怪物集目标点巡航功能

3.隐藏怪物的生成

4.怪物I攻击范围内的主动攻击

5.掉落坐骑蛋的获取

6.异步传送转换场景

7.主城的Npc对话功能

以及开放回合制、坐骑系统、宠物系统、背包系统、神炼系统、商城系统、Boss的目标跟随任务导航系统以及UI播放3D动画效果等等。

具体项目运行效果请关注water1024的b站视频项目演示《破碎纪元》

【Unity回合2.5D】破碎纪元_单机游戏热门视频 (bilibili.com)icon-default.png?t=N7T8https://www.bilibili.com/video/BV1rZY4e9Ebs/?spm_id_from=333.999.0.0&vd_source=547091a95b03acfa8e8a9e46ef499cd6

标签:坐骑,22,骑乘,transform,agent,Player,GetComponent,playerObj
From: https://blog.csdn.net/weixin_69360830/article/details/141900288

相关文章

  • 『功能项目』主角身旁召唤/隐藏坐骑【20】
    本章项目成果展示我们打开上一篇19坐骑UI搭建及脚本控制显/隐的项目,本章要做的事情是在坐骑UI界面点击召唤及隐藏坐骑的功能首先在外包中拖拽一个坐骑熊的预制体完全解压缩重命名为MountBear在资源文件夹Resources下的/预制体文件夹Prefabs下新建坐骑文件夹Mount......
  • 『功能项目』坐骑UI搭建及脚本控制显/隐【19】
    本章项目成果展示我们打开上一篇18怪物消亡掉落宝箱的项目,本章要做的事情是搭建一个坐骑UI界面,并通过键盘B键/右侧坐骑按钮控制坐骑UI界面的显示与隐藏在背包Bag上创建一个父物体,命名为Middle修改Bag的尺寸将下面资源图片放进Art文件夹将图片放在Art文......
  • 一台Ubuntu22.04物理机搭建虚拟机云和容器云集群,通过安装ESXi、配置GPU透传、创建虚拟
    一台Ubuntu22.04物理机搭建虚拟机云和容器云集群,通过安装ESXi、配置GPU透传、创建虚拟机,然后在虚拟机上搭建集群。步骤1:安装ESXi并配置GPU透传下载和准备ESXi:从VMware官方网站下载ESXi镜像。使用Rufus等工具将镜像写入U盘,以便将其作为启动盘。安装ESXi:将U盘插......
  • SCHNEIDER ATV630C22N4 220KW-380-480 变频器
    关于SCHNEIDERATV630C22N4220KW-380-480变频器,以下是一些详细的信息:一、基本信息品牌与型号:施耐德(Schneider)ATV630C22N4功率:220KW电压范围:380V-480V电源相数:三相二、产品特性应用范围:这款变频器广泛应用于水泵和电机等工业领域,其高性能和稳定性使其成为许多工业应用的理......
  • 第122期 UCF50动作识别数据集
    引言亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。一、背景在人工智能和计算机视觉领域,动作识别一直是研究的热点之一。为了推动这一......
  • NOIP2024集训Day22 DP常见模型3 - 区间
    NOIP2024集训Day22DP常见模型3-区间A.[SCOI2003]字符串折叠因为前面折叠了会对后面产生影响,所以很显然不能贪心。考虑区间DP。定义\(f_{i,j}\)表示\(i\)到\(j\)范围内可以折叠到的最短长度。答案为\(f_{1,n}\)。状态转移:对于\(f_{i,j}\),使用区间DP惯用套路,枚......
  • lc-2222
    publiclongnumberOfWays(Strings){char[]array=s.toCharArray();intn=array.length;long[][][]dp=newlong[2][4][2];for(inti=0;i<2;i++){dp[i][0][1]=1;dp[i][0][0]=1;......
  • H6922 低压升压恒压芯片 支持3.7V-5V-9V升12V24V30V48V54V60V72V100V 200W大功率
    H6922低压升压恒压芯片:高效能、多功能,应用于多种电源管理在当今的电子设备中,电源管理芯片扮演着至关重要的角色。其中,H6922作为一款好的低压升压恒压芯片,凭借其高效能、多功能以及应用领域,受到了市场的关注。产品概述H6922是一款外围电路简单的BOOST异步升压恒压控制驱动芯片,适用于......
  • 打卡信奥刷题(696)用Scratch图形化工具信奥B3922[普及组/提高] [GESP202312 一级] 小杨
    [GESP202312一级]小杨报数题目描述小杨需要从111到NNN报数......
  • 20240904_122638 mysql 填空题 dcl
    记录用户帐户密码的数据表,保存在哪个数据库中mysql记录用户帐户密码的数据表,叫什么名字user创建了一个名为pyhui的用户,该用户只能从本地机器连接到MySQL服务器,并且其密码是abccreateuser'pyhui'@'localhost'identifiedby'abc'删除名为pyhui的用户,该用户只能从localho......