unity3d入门教程五

news2024/9/27 21:29:54

unity3d入门教程五

  • 13鼠标事件处理
  • 13.2鼠标跟随
  • 13.3鼠标拖拽(选中对象,拖动对象)
  • 13.4几个问题
  • 14.1事件函数
  • 14.2脚本的执行顺序
  • 14.3脚本的参数
  • 14.4引用类型的参数(进行图片更换,人物换装)

13鼠标事件处理

需要好好学习,不然一些有趣的操作就无法实现了

鼠标跟随
飞机飞行的方向会根据鼠标进行移动,鼠标移到哪,飞机就朝哪飞

在B站没有发布此相关视频,需要去网盘中寻找
在这里插入图片描述
在这里插入图片描述

在 Update() 里,可以探测鼠标事件

if(Input.GetMouseButtonDown(0))
{  
  Debug.Log("鼠标按下" + Input.mousePosition);      
}
其中,0代表左键,1为右键,2为中键 (滚轮) 
           Input.mousePosition 代表此时鼠标的位置 ( 屏幕坐标 )

在这里插入图片描述
在这里插入图片描述

注意区分事件和状态是不同的,如鼠标按下不同,BUTTONDOWN事件只触发一次,只打印一次,而BUTTN状态是一直被触发,显示是否一直按着的状态的。

区分:

Input.GetMouseButtonDown(0)  检查鼠标按下事件
Input.GetMouseButtonUp(0)      检查鼠标抬起事件
Input.GetMouseButton(0)           检查鼠标状态 ( 是否是按下状态 )

其中,Input.GetMouseButtonDown(0) 事件不会重复触发
验证:保持鼠标一直按下,观察打印输出。。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

鼠标的位置 Input.mousePosition
屏幕坐标  世界坐标
示例:

 Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
 Debug.Log("世界坐标: " + pos);
 pos.z = 0;    // 把Z坐标置0,放到2D平面上来

在这里插入图片描述

13.2鼠标跟随

在这里插入图片描述

飞机自动调整前进的方向,使其自动朝着鼠标所在的方向进行追随

当鼠标按下时,可以控制飞机转向,而鼠标抬起就不控制了

后期还是有很多优化的,你可以让它有渐变的效果,让一开始转头的时候不至于太过于突兀

所有代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class gensui : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {

        // 检查 ‘当前鼠标左键是否按下’ ,此为状态检查
        if (Input.GetMouseButton(0))
        {
            Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            pos.z = 0;    // 把Z坐标置0,放到2D平面上来

            // 控制机头的指向
            SetDirection(pos);
        }

        float step = 1.2f * Time.deltaTime;
        transform.Translate(0, step, 0, Space.Self);
    }

    void SetDirection(Vector3 targetPos)
    {
        Vector3 face = transform.up; // 头部指向
        Vector3 direction = targetPos - transform.position;

        // 参考第11,12章
        float angle = Vector3.SignedAngle(face, direction, Vector3.forward);
        transform.Rotate(0, 0, angle);
    }
}

13.3鼠标拖拽(选中对象,拖动对象)

运行后通过鼠标可以拖拽物体

第一层优化代码如下:
此处效果是,不点击飞机,在平面任意位置点击,飞机会直接出现在鼠标的位置,按住移动鼠标,飞机也会跟着移动

有问题,没有按住飞机,它跳过来了
在这里插入图片描述

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Build.Reporting;
using UnityEngine;
using UnityEngine.UIElements;

public class MyJet : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {

        // 检查 ‘当前鼠标左键是否按下’ ,此为状态检查
        if ( Input.GetMouseButton(0) )
        {
            Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            pos.z = 0;    // 把Z坐标置0,放到2D平面上来


            transform.position = pos;

        }

    } 

}

第二层优化
对上方是否选中飞机进行判断,判断按下鼠标的坐标与飞机中心坐标的距离,处于范围内则是选中飞机了,鼠标只要抬起选中状态就为false

效果:虽然只有在点击飞机的时候才会选中移动,但是当点击与飞机中心有一定距离时会跳一下,飞机中心会瞬移到鼠标所在位置。

我们应该记住鼠标位置,进行相对一定,鼠标移动的距离其再一定这一定距离

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Build.Reporting;
using UnityEngine;
using UnityEngine.UIElements;

public class MyJet : MonoBehaviour
{
    private bool drag = false;//此为选中状态,处于选中择为TRUE,否则false
 
    // Start is called before the first frame update
    void Start()
    {
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {
        if ( Input.GetMouseButtonDown(0) )
        {
            Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            pos.z = 0;    // 把Z坐标置0,放到2D平面上来

            float distance = (pos - transform.position).magnitude;
            if(distance < 1.5f)
            {
                drag = true;
                
            }
        }

        if( Input.GetMouseButtonUp(0))
        {
            drag = false;
        }


        // 检查 ‘当前鼠标左键是否按下’ ,此为状态检查
        if ( drag )
        {
            Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            pos.z = 0;    // 把Z坐标置0,放到2D平面上来


            transform.position = pos;

        }

    }

}

第三层优化
进行更精细的操作,记录鼠标的位置,根据鼠标的相对位移进行计算

飞机的位置,鼠标移动的相对位置,飞机之前的位置加上鼠标相对位置得到飞机移动位置,并且再次更新飞机上次位置。

此时的效果,点击飞机时就不会突然跳动一下了

代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Build.Reporting;
using UnityEngine;
using UnityEngine.UIElements;

public class MyJet : MonoBehaviour
{
    private bool drag = false;
    private Vector3 lastMousePos;

    // Start is called before the first frame update
    void Start()
    {
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {
        if ( Input.GetMouseButtonDown(0) )
        {
            Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            pos.z = 0;    // 把Z坐标置0,放到2D平面上来

            float distance = (pos - transform.position).magnitude;
            if(distance < 1.5f)
            {
                drag = true;
                lastMousePos = pos;
            }
        }

        if( Input.GetMouseButtonUp(0))
        {
            drag = false;
        }


        // 检查 ‘当前鼠标左键是否按下’ ,此为状态检查
        if ( drag )
        {
            Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            pos.z = 0;    // 把Z坐标置0,放到2D平面上来

            Vector3 delta = pos - lastMousePos;
            transform.position += delta;

            lastMousePos = pos;
        }

    }

    

}

13.4几个问题

在这里插入图片描述

飞机处理了点击事件,那小球还有没有机会处理这个点击事件哪
在这里插入图片描述

在飞机和小球下各挂载一个脚本,第一个脚本和第二个脚本都接收鼠标点击事件,看输出结果如何
在这里插入图片描述

发现都触发了

鼠标点击事件所有的对象都会发送
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

内部执行即所有脚本会按照自定义的顺序进行执行

14.1事件函数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

先执行awake后执行start,都只执行一次,可以初始化放在其中

Awake是实例化,即在对象下有脚本组件,但脚本组件的对勾没打,在运行游戏时,此脚本的awake会被执行,但其他的如start是不被执行的

创建C#文件时,自动创建两个函数start(),update()

在这里插入图片描述

14.2脚本的执行顺序

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一般用不到执行顺序设置

可能设置为全局脚本,让其在最先执行设为负值,默认脚本执行的都是0,或者最后执行设为正值,其他脚本,没有特别要求的不要进行设计

14.3脚本的参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Fly : MonoBehaviour
{
    // 飞行速度
    public Vector3 speed ;

    // Start is called before the first frame update
    void Start()
    {
        Application.targetFrameRate = 60;
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 step = speed * Time.deltaTime; // 标量乘法

        transform.Translate(step, Space.Self);
    }
}

14.4引用类型的参数(进行图片更换,人物换装)

在这里插入图片描述

在游戏中看到的游戏对象,资源,游戏组件都可以在脚本中直接使用
在这里插入图片描述

实现换装功能,准备两种图片

当鼠标点击时,图片换成另外一张图片

如何实现:
将script render组件取出,修改其sprite属性即可,此属性就是其显示的哪张图片

演示:点击人物,实现换装功能。。

SpriteRenderer renderer = GetComponent<SpriteRenderer>();//取出组件
renderer.sprite = …  

显然,在脚本中需要指定2张图片,以便动态的切换
在这里插入图片描述

步骤:
1 在脚本中添加资源的引用

 public Sprite sprite0;

2 在Inspector中指定参数
把图片Sprite资源拖到 Inspector相应参数位置
3 在代码中切换图片显示

 renderer.sprite = this.sprite1;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

注意在VS附加到unity之后,虽然在断点处停下来了,还要在unity点击游戏运行
在这里插入图片描述

如上图,此时的sprite0和1就有值了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class changeFace : MonoBehaviour
{
    //获取两张图片从资源中,使用引用
    //资源图片由Sprite类型表示
    public Sprite sprite0;  //资源图片0,默认为空,并未指定

    public Sprite sprite1;//资源图片1

    private int index = 0;//定义显示的图片序列

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("start......");
    }

    // Update is called once per frame
    void Update()
    {
        //如果鼠标点击了
        if (Input.GetMouseButtonDown(0))
        {
            DoChange();
        }
    }

    //定义一个方法用于换图
    void DoChange()
    {
        //先拿到当前对象的渲染器
        SpriteRenderer renderer = GetComponent<SpriteRenderer>();
        if(index == 0)
        {
            index = 1;
            renderer.sprite = this.sprite1;//当前渲染为1
        }
        else
        {
            index = 0;
            renderer.sprite = this.sprite0;//当前渲染为0
        }
    }
}

在这里插入图片描述

当我们还要操作另一个对象人的时候,
如下

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

PointNet++改进策略 :模块改进 | PointCAT, 使用交叉注意力机制来提升3D点云任务中提升模型精度

论文题目&#xff1a;PointCAT:Cross-Attention Transformer for Point Cloud通讯地址&#xff1a;南京理工大学代码地址&#xff1a;https://github.com/xincheng-yang/PointCAT . PointCAT架构&#xff1a;PointCAT提出了一种基于交叉注意力机制的Transformer网络&#xff0c…

【Python机器学习】序列到序列建模——使用序列到序列网络构建一个聊天机器人

为了寻聊天机器人&#xff0c;下面使用康奈尔电影对话语料库训练一个序列到序列的网络来“适当的”湖大问题或语句。以下聊天机器人示例采用的是Keras blog中的序列到序列的示例。 为训练准备语料库 首先&#xff0c;需要加载语料库并从中生成训练集&#xff0c;训练数据将决…

项目升级必备!TS装饰:简化代码、增加功能的利器 | TypeScript入门指南07

嘿&#xff0c;朋友&#xff01;听说过TS里的装饰器没&#xff1f;就像给代码加了个‘魔法贴’&#xff0c;轻轻一点&#xff0c;功能升级&#xff0c;结构清晰。这篇文章&#xff0c;咱们聊聊这背后的魔法是怎么一回事&#xff01; ts 入门指南系列 Ts vs Js 谁适合前端开发&a…

用Inno Setup打包QT程序输出安装包

InnoSetup打包编译好的QT程序 文章目录 InnoSetup打包编译好的QT程序介绍具体步骤自定义脚本更改引入配置文件/动态库路径申请管理员权限设置安装过程界面的图标和图片C程序依赖运行库 介绍 Inno Setup&#xff1a;用于打包安装程序 具体步骤 首先打开inno setup compiler 第…

MES系统:智能工厂与数字化改造的关键引擎

一、概念范畴&#xff1a; 数字化工厂&#xff1a;是一个更广泛的概念&#xff0c;它强调整个制造过程的数字化转型&#xff0c;包括从产品设计、生产准备、制造过程、管理到营销等各个环节的数字化。数字化工厂利用信息技术、自动化技术和智能化技术对传统工厂进行改造和升级…

怎样在备忘录中添加提醒?怎么设置备忘录提醒

备忘录作为我们日常生活中常用的软件&#xff0c;其记录事项的便捷性已经得到了广泛认可。无论是工作计划、购物清单还是个人日记&#xff0c;备忘录都能帮助我们将这些信息快速记录下来。然而&#xff0c;如果备忘录能够进一步提供提醒功能&#xff0c;那么它将变得更加实用&a…

为什么要用docker?

目录 一、为什么会有docker出现 二、docker理念 三、容器与虚拟机的差异 四、开发/运维&#xff08;DevOps&#xff09; 五、企业级应用 一、为什么会有docker出现 一款产品从开发到上线&#xff0c;从操作系统&#xff0c;到运行环境&#xff0c;再到应用配置。作为开发…

pytorch快速入门(一)—— 基本工具及平台介绍

前言 该pytorch学习笔记应该配合b站小土堆的《pytorch深度学习快速入门教程》使用 环境配置&#xff1a;Anaconda Python编译器&#xff1a;pycharm、jupyter 两大法宝函数 dir&#xff08;&#xff09;&#xff1a;知道包中有什么东西&#xff08;函数 / 属性..…

串口数据波形显示工具对比

目录 1 Serial Port Plotter 1.1 界面 1.2 简介 1.3 使用方法 1.3.1 单通道示例 1.3.2 多通道示例 2 serialplot 2.1 界面 2.2 简介 2.3 使用方法 1 Serial Port Plotter 1.1 界面 1.2 简介 这是一款开源串口显示工具&#xff0c;项目链接&#xff1a; GitHub - C…

待机模式中WKUP上升沿模拟开机与关机

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 前言 待机模式 代码 wkup.h wkup.c main.c 使用注意 前言 建议先阅读下面的博客中待机模式部分。本博客主要分享代码-基于待机模式WKUP引脚的上升沿实现类似长按开机与关机的功能…

TikTok云手机解决运营效率低、封号问题

TikTok&#xff0c;一个拥有30亿下载量、10亿活跃用户的全球热门平台&#xff0c;已成为众多出海商家的首选运营阵地。其玩法与国内抖音相似&#xff0c;为运营者提供了熟悉的操作环境&#xff0c;降低了上手难度。然而&#xff0c;随着TikTok的快速发展&#xff0c;运营者们也…

德之匠信息化阶段模型

今天适逢仲秋佳节&#xff0c;祝大家幸福安康&#xff01; 春生、夏长、秋天也是我们作为知识工作者最开心的季节。经历了项目实践、课题研究&#xff0c;终于能思有一得&#xff0c;是世上第一等的好事。 这个题目的背景是这样。近期我们在做一批中长期信息化项目的分析和总…

深度学习基础案例5--运用动态学习率构建CNN卷积神经网络实现的运动鞋识别(测试集的准确率84%)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 前几天一直很忙&#xff0c;一直在数学建模中&#xff0c;没有来得及更新&#xff0c;接下来将恢复正常这一次的案例很有意思&#xff1a;在学习动态调整…

【IP协议】解决 IP 地址不够用的问题(IP地址管理:动态分配、NAT、Ipv6)

文章目录 方案一、动态分配 IP 地址方案二、NATNAT 机制的缺点 方案三、IPv6 方案一、动态分配 IP 地址 一个设备上网就分配 IP&#xff0c;不上网就先不分配&#xff08;权宜之计&#xff09; 方案二、NAT 网络地址转换 以一当千&#xff0c;使用一个 IP&#xff0c;代表一大…

Golang | Leetcode Golang题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; func isLeafNode(node *TreeNode) bool {return node.Left nil && node.Right nil }func sumOfLeftLeaves(root *TreeNode) (ans int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {node : q[0]q q[1:]if no…

anaconda 离线安装PySimpleGUI

下载离线py包 PySimpleGUI-5.0.6-py3-none-any.whl&#xff08;官网&#xff09;pyasn1-0.6.1-py3-none-any.whl&#xff08;清华镜像&#xff09;rsa-4.9-py3-none-any.whl&#xff08;清华镜像&#xff09; 打开Anaconda Prompt 测试 # -*- utf-8 -*- import PySimpleGUI …

同城找搭子小程序有哪些?找搭子社交软件测评笔记分享

寻找搭子不再迷茫&#xff01;今日测评几款热门找搭子小程序&#xff0c;为你开启全新社交体验。真实体验&#xff0c;深度剖析&#xff0c;帮你找到最适合的搭子平台&#xff0c;快来一探究竟。 1. 咕哇找搭子小程序&#xff1a;这是一个实名制的找搭子交友平台。正是由于实名…

任务通知(Task Notifications)

任务通知简介 相对于以前使用 FreeRTOS 内核通信的资源&#xff0c; 必须创建队列、 二进制信号量、计数信号量或事件组的情况&#xff0c; 使用任务通知显然更灵活。 按照 FreeRTOS 官方的说法&#xff0c; 使用任务通知比通过信号量等 IPC 通信方式解除阻塞的任务要快 45%&a…

基于RFID的门禁系统的设计(论文+源码)

1系统方案设计 通过需求分析&#xff0c;基于RFID的门禁系统总体设计框图。系统采用STM32单片机作为系统主控核心&#xff0c;利用独立按键与RFID识别模块能够实现门禁系统密码与IC卡开门功能。WiFi模块实现系统与手机APP的通信&#xff0c;用户可以通过手机APP进行门禁开关操…

怀孕之天赋共享:提高智商

想办法怀个哪吒享受三年&#xff0c;哈哈哈哈哈 话说我们有个同事&#xff0c;是属于憨得有点愣那种&#xff0c;情商也低。怀孕以后突然有一天我觉得她聪明了好几个数量级&#xff01;反应也快了说话也会说了&#xff0c;我说是不是她的宝宝给她提高了智商&#xff1f;后来生…