项目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.hqwc.cn/news/459534.html

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

相关文章

PCIE Order Set

1 Training Sequence Training Sequence是由Order Set(OS) 组成&#xff0c;它们主要是用于bit aligment&#xff0c;symbol aligment&#xff0c;交换物理层的参数。当data_rate 2.5GT or 5GT 它们不会被扰码(scramble)&#xff0c;当date_rate 8GT or higher 根据特殊的规…

Nginx中logs的nginx.pid文件引发的问题

Nginx中logs的nginx.pid文件引发的问题 Q1&#xff1a;nginx: [error] CreateFile() "D:\software\nginx-1.22.1/logs/nginx.pid" failed (2: The system cannot find the file specified)Q2&#xff1a;nginx: [error] invalid PID number "" in "D:…

HiveSQL——借助聚合函数与case when行转列

一、条件函数 if 条件函数 if函数是最常用到的条件函数&#xff0c;其写法是if(xn,a,b), xn代表判断条件&#xff0c;如果xn时&#xff0c;那么结果返回a ,否则返回b。 selectif(age < 25 or age is null, 25岁以下, 25岁以上) as age_cnt,count(1) as number from table…

[项目管理] 如何使用git客户端管理gitee的私有仓库

最近发现即使翻墙也无法g使用ithub了&#xff0c;需要把本地的项目搬迁到新的git托管平台。 gitee 是一个国内开源项目托管平台&#xff0c;是开源开发者、团队、个人进行 git 代码管理和协作的首选平台之一。本文将详细介绍如何向 gitee 提交私有项目。 注册 Gitee 账号并创建…

【Linux权限】

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 扩展知识&#xff1a…

Pymysql之Cursor常用API

Cursor常用API 1、cursor.execute(query, argsNone)&#xff1a;执行sql语句。 参数: query (str)&#xff1a;sql语句。 args (tuple, list or dict)&#xff1a;sql语句中如果有变量&#xff0c;或者格式化输出&#xff0c;会在这里填充数据。 Returns&#xff1a;返…

【开源】SpringBoot框架开发大病保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大病保险管理2.4 大病登记管理2.5 保险审核管理 三、系统详细设计3.1 系统整体配置功能设计3.2 大病人员模块设计3.3 大病保险模块设计3.4 大病登记模块设计3.5 保险审核模块设计 四、…

【C#】.net core 6.0 创建默认Web应用,以及默认结构讲解,适合初学者

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

17:定时器编程实战

1、实验目的 (1)使用定时器来完成LED闪烁 (2)原来实现闪烁时中间的延迟是用delay函数实现的&#xff0c;在delay的过程中CPU要一直耗在这里不能去做别的事情。这是之前的缺点 (3)本节用定时器来定一个时间&#xff08;譬如0.3s&#xff09;&#xff0c;在这个定时器定时时间内…

【Java】ArrayList和LinkedList的区别是什么

目录 1. 数据结构 2. 性能特点 3. 源码分析 4. 代码演示 5. 细节和使用场景 ArrayList 和 LinkedList 分别代表了两类不同的数据结构&#xff1a;动态数组和链表。它们都实现了 Java 的 List 接口&#xff0c;但是有着各自独特的特点和性能表现。 1. 数据结构 ArrayList…

CPP项目:Boost搜索引擎

1.项目背景 对于Boost库来说&#xff0c;它是没有搜索功能的&#xff0c;所以我们可以实现一个Boost搜索引擎来实现一个简单的搜索功能&#xff0c;可以更快速的实现Boost库的查找&#xff0c;在这里&#xff0c;我们实现的是站内搜索&#xff0c;而不是全网搜索。 2.对于搜索…

STM32学习笔记——定时器

目录 一、定时器功能概述 1、基本定时器&#xff08;TIM6&TIM7&#xff09; 工作原理 时序 2、通用计时器&#xff08;TIM2&TIM3&TIM4&TIM5&#xff09; 时钟源 外部时钟源模式1&2 外部时钟源模式2 外部时钟源模式1 定时器的主模式输出 输入捕获…