项目02《游戏-11-开发》Unity3D

基于      项目02《游戏-10-开发》Unity3D      ,

任务:飞行坐骑

首先创建脚本,


绑定脚本,

using UnityEngine;
public class Dragon : MonoBehaviour{
    [SerializeField]
    private float speed = 10f;
    public Transform player;
    private bool isInDragon = false;
    private Vector3 dragonPosition;// 坐骑位置
    void Update(){
        if (isInDragon){//下坐骑
            if (Input.GetKeyDown(KeyCode.Q)){
                isInDragon = false;
                dragonPosition = transform.position;// 保存坐骑的位置
                player.position = dragonPosition + Vector3.right * 2f;
                Camera.main.GetComponent<CameraCtrl>().target = player;
                player.gameObject.SetActive(true);
            }
            else if (Input.GetKey(KeyCode.LeftArrow))
                transform.Translate(Vector3.up * speed * Time.deltaTime);
            else if (Input.GetKey(KeyCode.RightArrow))
                transform.Translate(Vector3.down * speed * Time.deltaTime);
            else if (Input.GetKey(KeyCode.UpArrow))
                transform.Translate(Vector3.forward * speed * Time.deltaTime);
            else if (Input.GetKey(KeyCode.DownArrow))
                transform.Translate(Vector3.back * speed * Time.deltaTime);
            if (Input.GetKey(KeyCode.A))
                transform.Rotate(Vector3.up * speed * Time.deltaTime * 5f * -1);
            else if (Input.GetKey(KeyCode.D))
                transform.Rotate(Vector3.up * speed * Time.deltaTime * 5f);
        }
        else{
            if (Input.GetKeyDown(KeyCode.Q)){
                if (Vector3.Distance(transform.position, player.position) < 10f){
                    isInDragon = true;
                    player.gameObject.SetActive(false);
                    Camera.main.GetComponent<CameraCtrl>().target = transform;
                    print(transform.position);
                }
            }
        }
    }
}

修改脚本:在Camera.cs脚本中添加public公开Transform类型变量 target就够了,

using UnityEngine;
public class CameraCtrl : MonoBehaviour{
    public float dis;
    public float height;
    public float speed;
    public Transform target;
    Vector3 targetPos;
    void Start(){
        target = MainGame.player.transform;
    }
    void Update(){
        transform.LookAt(target.position + Vector3.up * 1.5f);
        targetPos = target.forward * (-dis) + target.up * height + target.position;
    }
    void LateUpdate(){
        transform.position = Vector3.Lerp(transform.position, targetPos, speed);
    }
    void SetTarget(){
        //将标签为Player的物体设置为跟踪目标
        Transform player = GameObject.FindGameObjectWithTag("Player").transform;
        if (player != null && target == null)
            target = player;
    }
}

记得绑定:

运行 人物在坐骑附近时按Q键即可进入坐骑飞行模式,

方向键上/下/左/右分别代表 :前进飞行/后退飞行/上升/下降,

A键:左方向旋转 D键:右方向旋转

再次按Q键:取消飞行

暂时效果图:

现在为坐骑【龙】添加动画器,如果动画器部分不明白可以看此项目的第一集,

绑定动画器:

在修改坐骑脚本之前:让坐骑【龙】的飞行带有动画更生动形象,

我们要加一行代码让人物骑在龙身上,

首先在龙预制体空间中在其子物体添加人物并设置成隐藏状态命名为Player1

修改坐骑龙代码:

using UnityEngine;
public class Dragon : MonoBehaviour{
    [SerializeField]
    private float speed = 10f;
    public Transform player;
    private bool isInDragon = false;
    private Vector3 dragonPosition;// 坐骑位置
    void Update(){
        if (isInDragon){//下坐骑
            if (Input.GetKeyDown(KeyCode.Q)){
                isInDragon = false;
                dragonPosition = transform.position;// 保存坐骑的位置
                player.position = dragonPosition + Vector3.right * 2f;
                Camera.main.GetComponent<CameraCtrl>().target = player;
                transform.Find("Player1").gameObject.SetActive(false);
                player.gameObject.SetActive(true);
            }
            else if (Input.GetKey(KeyCode.LeftArrow))
                transform.Translate(Vector3.up * speed * Time.deltaTime);
            else if (Input.GetKey(KeyCode.RightArrow))
                transform.Translate(Vector3.down * speed * Time.deltaTime);
            else if (Input.GetKey(KeyCode.UpArrow))
                transform.Translate(Vector3.forward * speed * Time.deltaTime);
            else if (Input.GetKey(KeyCode.DownArrow))
                transform.Translate(Vector3.back * speed * Time.deltaTime);
            if (Input.GetKey(KeyCode.A))
                transform.Rotate(Vector3.up * speed * Time.deltaTime * 5f * -1);
            else if (Input.GetKey(KeyCode.D))
                transform.Rotate(Vector3.up * speed * Time.deltaTime * 5f);
        }
        else{
            if (Input.GetKeyDown(KeyCode.Q)){
                if (Vector3.Distance(transform.position, player.position) < 10f){
                    isInDragon = true;
                    player.gameObject.SetActive(false);
                    transform.Find("Player1").gameObject.SetActive(true);
                    Camera.main.GetComponent<CameraCtrl>().target = transform;
                    print(transform.position);
                }
            }
        }
    }
}
接着实现动画部分代码:

using UnityEngine;
public class Dragon : MonoBehaviour{
    [SerializeField]
    private float speed = 10f;
    public Transform player;
    private bool isInDragon = false;
    private Vector3 dragonPosition;// 坐骑位置
    Animator animator;
    void Start(){
        animator = GetComponent<Animator>();
    }
    void Update(){
        if (isInDragon){//下坐骑
            if (Input.GetKeyDown(KeyCode.Q)){
                animator.SetBool("IsFly", false);
                isInDragon = false;
                dragonPosition = transform.position;// 保存坐骑的位置
                player.position = dragonPosition + Vector3.right * 2f;
                Camera.main.GetComponent<CameraCtrl>().target = player;
                transform.Find("Player1").gameObject.SetActive(false);
                player.gameObject.SetActive(true);
            }
            else if (Input.GetKey(KeyCode.LeftArrow))
                transform.Translate(Vector3.up * speed * Time.deltaTime);
            else if (Input.GetKey(KeyCode.RightArrow))
                transform.Translate(Vector3.down * speed * Time.deltaTime);
            else if (Input.GetKey(KeyCode.UpArrow))
                transform.Translate(Vector3.forward * speed * Time.deltaTime);
            else if (Input.GetKey(KeyCode.DownArrow))
                transform.Translate(Vector3.back * speed * Time.deltaTime);
            if (Input.GetKey(KeyCode.A))
                transform.Rotate(Vector3.up * speed * Time.deltaTime * 5f * -1);
            else if (Input.GetKey(KeyCode.D))
                transform.Rotate(Vector3.up * speed * Time.deltaTime * 5f);
        }
        else{//上坐骑
            if (Input.GetKeyDown(KeyCode.Q)){
                if (Vector3.Distance(transform.position, player.position) < 5f){
                    isInDragon = true;
                    //player.gameObject.SetActive(false);
                    GameObject.Find("Player").SetActive(false);
                    transform.Find("Player1").gameObject.SetActive(true);
                    Camera.main.GetComponent<CameraCtrl>().target = transform;
                    animator.SetBool("IsFly", true);
                }
            }
        }
    }
}
运行即可实现飞行:

运行 人物在坐骑附近时按Q键即可进入坐骑飞行模式,

方向键上/下/左/右分别代表 :前进飞行/后退飞行/上升/下降,

A键:左方向旋转 D键:右方向旋转

再次按Q键:取消飞行

在龙附近处按Q键:

左右键控制上升下降,

AD键控制左转右转,

上下键控制前进后退,

右方向键下落 再次按Q键实现降落,

End.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/379389.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何判断线程池已经执行完所有任务了?

目录 不判断的问题 方法1&#xff1a;isTerminated 缺点分析 扩展&#xff1a;线程池的所有状态 方法2&#xff1a;getCompletedTaskCount 方法说明 优缺点分析 方法3&#xff1a;CountDownLatch&#xff08;推荐&#xff09; 优缺点分析 方法4&#xff1a;CyclicBar…

微软.NET6开发的C#特性——委托和事件

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;下面我就重点讲讲微软.NET6开发人员需要知道的C#特性&#xff0c;然后比较其他各种语言进行认识。 C#经历了多年发展…

计算机网络基本知识(二)

文章目录 概要分层为什么分层怎么分层&#xff1f;1.实体2.协议3.服务 分层基本原则正式认识分层详细例子解释 总结 概要 分层知识&#xff1a;概念理解 分层 为什么分层 大致以上五点 为了解决上面的问题&#xff08;复杂&#xff09; 大问题划分为小问题 怎么分层&#…

Stable Diffusion 模型下载:Disney Pixar Cartoon Type B(迪士尼皮克斯动画片B类)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 这是我之前的模型迪士尼皮克斯卡通类型A与我自己训练的Lora在中途旅程图像上的合并结果。与之前的版本相比&#xff0c;男性和老年人看起来更像真正的皮克斯角色&a…

黄金交易策略:手工同向单减保留仓

虽然保留仓的仓位不大&#xff0c;扛个一年半载不是问题&#xff0c;但闲着也可以手工处理掉&#xff08;10000点以内的不要处理&#xff09;。挑一个最大的单&#xff0c;同向相同的手数&#xff0c;并把两单的止盈设置中位数&#xff08;也没有这么严格&#xff0c;差不多就好…

Node.js之npm单独与批量升级依赖包的方式

Node.js之npm单独与批量升级依赖包的方式 文章目录 Node.js之npm单独与批量升级依赖包的方式npm查看与升级依赖包1. 单独安装或升级最新版本2. 查看依赖但不升级1. npm outdated2. npm update 3. 批量升级新版本4. npm-check-updates1. 全局安装2. ncu查看可升级的版本3. 升级依…

【Linux驱动】块设备驱动(三)—— 块设备读写(不使用请求队列)

并非每种块设备都会用到请求队列&#xff0c;从上节可以知道&#xff0c;请求队列的作用是管理和调用IO请求&#xff0c;那么反过来想&#xff0c;如果IO请求较少&#xff0c;那就可以无需使用请求队列。在以下情况中&#xff0c;可以不使用请求队列。 单任务环境: 当系统中只有…

懒人精灵 之 Lua 捕获 json解析异常 ,造成的脚本停止.

Time: 2024年2月8日20:21:17 by:MemoryErHero 1 异常代码 Expected value but found T_END at character 12 异常代码 Expected value but found T_OBJ_END at character 223 处理方案 - 正确 json 示范 while true do--Expected value but found T_END at character 1--Ex…

tab 切换类交互功能实现

tab切换类交互&#xff1a; 记录激活项&#xff08;整个对象/id/index)动态类型控制 下面以一个地址 tab 切换业务功能为例&#xff1a; <div class"text item" :class"{active : activeAddress.id item.id}" click"switchAddress(item)"…

python-pandas查漏补缺

1. create labels for Series 2. 3. 4. 用平均数等去填empty的格子 5. 6. 7.

Pandas 数据处理-排序与排名的深度探索【第69篇—python:文本数据处理】

文章目录 Pandas 数据处理-排序与排名的深度探索1. sort_index方法2. sort_values方法3. rank方法4. 多列排序5. 排名方法的参数详解6. 处理重复值7. 对索引进行排名8. 多级索引排序与排名9. 更高级的排序自定义10. 性能优化技巧10.1 使用nsmallest和nlargest10.2 使用sort_val…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Stepper组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Stepper组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Stepper组件 鸿蒙&#xff08;HarmonyOS&#xff09;仅能包含子组件StepperIte…

【Java EE】----SpringBoot的日志文件

1.SpringBoot使用日志 先得到日志对象通过日志对象提供的方法进行打印 2.打印日志的信息 3.日志级别 作用&#xff1a; 可以筛选出重要的信息不同环境实现不同日志级别的需求 ⽇志的级别分为&#xff1a;&#xff08;1-6级别从低到高&#xff09; trace&#xff1a;微量&#…

L1-088 静静的推荐

一、题目 二、解题思路 如果有的学生天梯赛成绩虽然与前一个人相同&#xff0c;但其参加过 PAT 考试&#xff0c;且成绩达到了该企业的面试分数线&#xff0c;则也可以接受——同一批次这样的人可以有多个&#xff01;&#xff01;&#xff01;如果 pta 分数不低于 175 &#…

【MySQL】:深入理解并掌握DML和DCL

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. DML1.1 添加数据1.2 修改数据1.3 删除数据 二. DCL2.1 管理用户2.2 权限控制…

【已解决】:pip is configured with locations that require TLS/SSL

在使用pip进行软件包安装的时候出现问题&#xff1a; WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 解决&#xff1a; mkdir -p ~/.pip vim ~/.pip/pip.conf然后输入内容&#xff1a; [global] ind…

PSM-Net根据Stereo图像生成depth图像

一、新建文件夹 在KITTI数据集下新建depth_0目录 二、激活anaconda环境 conda activate pt14py37三、修改submission.py文件 3.1 KITTI数据集路径 parser.add_argument(--datapath, default/home/njust/KITTI_DataSet/00/, helpselect model)3.2 深度图像输出路径 save…

linux(redhat)重置root密码

首先将root密码改成几乎不可能记住的密码 [rootexample ~]# echo fheowafuflaeijifehowf|passwd --stdin root Changing password for user root. passwd: all authentication tokens updated successfully.重启系统&#xff0c;进入救援模式 出现此页面&#xff0c;按e键 lin…

苏宁易购移动端首页(rem布局)

技术选型 方案∶采取单独制作移动页面方案技术:布局采取rem适配布局( less rem &#xff0b;媒体查询)设计图:设计图采用750px设计尺寸 设置视口标签以及引入初始化样式 <meta name"viewport" content"widthdevice-width, initial-scale1.0, user-scalable…

python-基础篇-列表-脚本

文章目录 01_下标.py02_查找.py03_判断是否存在.py04_体验案例判断是否存在.py05_列表增加数据之append.py06_列表增加数据之extend.py07_列表增加数据之insert.py08_列表删除数据.py09_列表修改数据.py10_列表复制数据.py11_列表的循环遍历之while.py12_列表的循环遍历之for.p…