当前位置: 首页 > article >正文

项目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.kler.cn/news/233622.html

相关文章:

  • Vue3.4+element-plus2.5 + Vite 搭建教程整理
  • VUE2和VUE3区别对比一览
  • 【量子通信】量子通信技术:前景与挑战
  • Flask实现异步调用sqlalchemy的模型类
  • Leetcode—135. 分发糖果【中等】
  • C++重新入门-C++数据类型
  • 【深度学习】实验7布置,图像超分辨
  • 论文阅读-Automated Repair of Programs from Large Language Models
  • Python+django企业人力资源公司人事管理系统lq9t2
  • 三、搜索与图论
  • 在 MacOS M系列处理器上使用 Anaconda 开发 Oralce 的Python程序
  • Redis缓存高可用集群
  • Python列表中的insert功能及用法举例
  • 【Flink】FlinkSQL实现数据从Kafka到MySQL
  • 微信小程序,IOS兼容日期格式问题,注意ios高低版本兼容性不一致
  • 【QT+QGIS跨平台编译】之二十八:【Protobuf+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • 第62讲商品搜索动态实现以及性能优化
  • python实现基数排序
  • 苹果macbook电脑删除数据恢复该怎么做?Mac电脑误删文件的恢复方法
  • 物资捐赠管理系统
  • 8种基本类型的包装类(与String的转换)
  • 降准是什么意思?降准对股市有哪些影响?
  • 第70讲axios后端请求工具类封装
  • MySQL单主模式部署组复制集群
  • 机器学习聚类算法
  • Collectors.toMap
  • MySQL基础查询篇(9)-数学函数在查询中的应用
  • Linux中的numactl命令指南
  • 代码随想录算法训练营day15||二叉树part02、102.二叉树的层序遍历、 226.翻转二叉树(优先掌握递归)、101. 对称二叉树 (优先掌握递归)
  • MATLAB实现随机森林回归算法