项目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.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP协议以及UDP(超详细,看这一篇就够了)

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录专栏&#xff1a;TCP/IP协议以及UDP(超详细,看这一篇就够了) &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 TCP/IP协议以及UDP(超详细,看这一篇就够了 前提概括接收端和发送端客户…

【Linux】Linux开发工具(yum、gdb、git)详解

一、软件包管理器 yum 1、什么是软件包 在 Linux 下安装软件&#xff0c;通常的办法是下载到程序的源代码&#xff0c;并进行编译&#xff0c;得到可执行程序。但这样太麻烦了&#xff0c;于是有些人把一些常用的软件提前编译好&#xff0c;做成软件包&#xff08;可以理解成…

MySQL 主键策略导致的效率性能

MySQL官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一)&#xff0c;而是推荐连续自增的主键id&#xff0c;官方的推荐是auto_increment 一、准备三张表 分别是user_auto_key&#xff0c;user_uuid&#xff0c;user_random_key&#xff0c;分别表示自动增长的主键…

【开源】JAVA+Vue.js实现在线课程教学系统

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…

C#,雷卡曼数(Recamán Number)的算法与源代码

1 雷卡曼数&#xff08;Recamn Number&#xff09; 雷卡曼数&#xff08;Recamn Number&#xff09;&#xff0c;即Recaman序列被定义如下&#xff1a; (1) a[0]0; (2) 如果a[m-1]-m>0并且这个值在序列中不存在&#xff0c;则a[m]a[m-1]-m; (3) 否则a[m]a[m-1]m; 雷卡曼序…

OCP使用web console创建和构建应用

文章目录 环境登录创建project赋予查看权限部署第一个image检查pod扩展应用 部署一个Python应用连接数据库创建secret加载数据并显示国家公园地图 清理参考 环境 RHEL 9.3Red Hat OpenShift Local 2.32 登录 在 crc start 启动crc时&#xff0c;可以看到&#xff1a; .....…

蓝桥杯备赛Day9——链表进阶

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]示例 2: 输入:head = [1], n = 1 输出:[]示例 3: 输入:head = [1,2], n = 1 输出:[1]提示: 链表中结点的数目为 sz1 <= sz <= 300 &l…

Linux操作系统基础(二):Linux操作系统概述

文章目录 Linux操作系统概述 一、Linux起源 二、Linux 的含义 三、Linux发行版 Linux操作系统概述 一、Linux起源 Linux创始人——林纳斯 托瓦兹 Linux 诞生于1991年&#xff0c;作者上大学期间实现的 Linux的特点&#xff1a;开源、免费、拥有最为庞大的源码贡献者 …

【数据结构】前缀树的模拟实现

目录 1、什么是前缀树&#xff1f; 2、模拟实现 2.1、前缀树节点结构 2.2、字符串的添加 2.3、字符串的查寻 2.3.1、查询树中有多少个以字符串"pre"作为前缀的字符串 2.3.2、查询某个字符串被添加过多少次 2.4、字符串的删除 3、完整代码 1、什么是前缀树&…

K8S系列文章之 [使用 Alpine 搭建 k3s]

官方文档&#xff1a;K3s - 轻量级 Kubernetes | K3s 官方描述&#xff0c;可运行在 systemd 或者 openrc 环境上&#xff0c;那就往精简方向走&#xff0c;使用 alpine 做系统。与 RHEL、Debian 的区别&#xff0c;主要在防火墙侧&#xff1b;其他基础配置需求类似&#xff0…

[每周一更]-(第86期):PostgreSQL入门学习和对比MySQL

入门学习PostgreSQL可以遵循以下步骤&#xff1a; 安装 PostgreSQL&#xff1a; 首先&#xff0c;你需要在你的计算机上安装 PostgreSQL。你可以从 PostgreSQL 官方网站 下载适合你操作系统的安装包&#xff0c;并按照官方文档的指导进行安装。 学习 SQL&#xff1a; PostgreS…

【大厂AI课学习笔记】【1.5 AI技术领域】(7)图像分割

今天学习到了图像分割。 这是我学习笔记的脑图。 图像分割&#xff0c;Image Segmentation&#xff0c;就是将数字图像分割为若干个图像子区域&#xff08;像素的集合&#xff0c;也被称为超像素&#xff09;&#xff0c;改变图像的表达方式&#xff0c;以更容易理解和分析。 …

〔Part1〕YOLOv5:原理+源码分析(配置文件、网络模块、损失函数、跨网格匹配策略)

1. 前置知识 1.1 YOLO 算法的基本思想 首先通过特征提取网络对输入图像提取特征&#xff0c;得到一定大小的特征图&#xff0c;比如 13x13&#xff08;相当于416x416 图片大小&#xff09;&#xff0c;然后将输入图像分成 13x13 个 grid cells&#xff1a; YOLOv3/v4&#xf…

leetcode:17.电话号码的字母组合

题意和解题思路&#xff1a; 数字和字母的一一对应采用二维数组或者map映射。 这里我采用数组进行存储进而实现一一对应。由于我们无法知道for循环嵌套几层&#xff0c;因为这个是由于输入来确定的&#xff0c;所以我们可以用回溯算法中的递归来进行实现。 树形结构&#xff…

git版本回退。git reset参数详解,特殊提交情形下的git push操作(CR等常见场景),git reflog和git log的详解。

切换分支可以使用 git checkout <> 或者git switch ... 创建分支可以使用 git checkout -b <. ...> 或 git branch <...> git checkout <...> git reset --hrad HEAD^ -- 今日份chatgpt git reset --hard HEAD^ 的含义如下&#xff1a; git reset …

利用知识图谱构建医疗问答

1、准备数据集 数据集下载地址&#xff1a;https://github.com/wangle1218/QASystemOnMedicalKG/blob/master/data/medical.json 2、导入相关包 from py2neo import Graph,Node,Relationship # 在cmd中&#xff0c;输入neo4j.bat console并回车 import pandas as pd3、连接N…

【web前端开发】HTML及CSS简单页面布局练习

案例一 网页课程 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…

Android 识别车牌信息

打开我们心爱的Android Studio 导入需要的资源 gradle //开源车牌识别安卓SDK库implementation("com.github.HyperInspire:hyperlpr3-android-sdk:1.0.3")button.setOnClickListener(v -> {Log.d("Test", "");try (InputStream file getAs…

「递归算法」:子集(两种解法)

一、题目 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2]…

-打印流-

打印流分为字节打印流&#xff1a;PrintStream 字符打印流&#xff1a;PrintWriter特点1&#xff1a;都是只能输出 不能读取 字节打印流&#xff1a; 构造方法&#xff1a;主要用上面的两个构造 成员方法&#xff1a; //创建字节打印流对象&#xff1a;ctrlp注意参数 Prin…