unity3d入门教程五

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 updatevoid Start(){Application.targetFrameRate = 60;}// Update is called once per framevoid 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 updatevoid Start(){Application.targetFrameRate = 60;}// Update is called once per framevoid 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 updatevoid Start(){Application.targetFrameRate = 60;}// Update is called once per framevoid 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 updatevoid Start(){Application.targetFrameRate = 60;}// Update is called once per framevoid 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 updatevoid Start(){Application.targetFrameRate = 60;}// Update is called once per framevoid 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;//资源图片1private int index = 0;//定义显示的图片序列// Start is called before the first frame updatevoid Start(){Debug.Log("start......");}// Update is called once per framevoid 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.rhkb.cn/news/424803.html

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

相关文章

自由流转--实例

一、自由流转的形态 流转能力打破设备界限&#xff0c;多设备联动&#xff0c;使用户应用程序可分可合、可流转&#xff0c;实现如邮件跨设备编辑、多设备协同健身、多屏游戏等分布式业务。 二、跨端迁移 在应用开发层面&#xff0c;跨端迁移指在A端运行的UIAbility迁移到B端上…

Linux操作系统如何添加新字体

在一个Linux操作系统及办公软件刚安装后&#xff0c;会发现缺少常用的“楷体_GB2312”和“仿宋_GB2312”字体。此时&#xff0c;只需要从其它电脑复制到或者从互联网上下载到这两个字体文件&#xff0c;然后导入到自己的电脑即可&#xff0c;再次打开办公软件就会看到这个字体已…

linux重要文件

/etc/sysconfig/network-scripts/ifcfg-eth1 网卡重启 /etc/init.d/network restart ifup ethname & ifdown ethname /etc/resolv.conf 设置Linux本地的客户端DNS的配置文件 linux客户端DNS可以在网卡配置文件(/etc/sysconfig/network/ifcfg-eth0 DNS2)里配置 也可以在/et…

FL Studio 24.1.1.4285中文破解完整版免费下载FL 2024注册密钥完整版crack百度云安装包下载

FL Studio 24.1.1.4285中文破解版是一个强大的软件选项&#xff0c;可以使用专业应用程序&#xff08;如最先进的录音机、均衡器、内置工具等&#xff09;制作循环和歌曲。它由数百个合成器和混响等效果以及均衡器组成&#xff0c;除此之外&#xff0c;您还可以在新音乐制作的方…

9. 什么是 Beam Search?深入理解模型生成策略

是不是总感觉很熟悉&#xff1f; 在之前第5&#xff0c;7&#xff0c;8篇文章中&#xff0c;我们都曾经用到过与它相关的参数&#xff0c;而对于早就有着实操经验的同学们&#xff0c;想必见到的更多。这篇文章将从示例到数学原理和代码带你进行理解。 Beam Search 对应的中文翻…

【C++】queue和priority_queue

个人主页~ queue和priority_queue 一、queue的介绍和使用1、queue的介绍2、queue的使用3、queue的模拟实现 二、priority_queue的介绍和使用1、priority_queue的介绍2、priority_queue的使用3、priority_queue的模拟实现 三、仿函数1、仿函数的特征2、仿函数的使用 ex、有关于l…

2020-11-04 求最小与均值输入0结束

缘由编写c语言希望进行一些解释_编程语言-CSDN问答 void 求最小与均值输入0结束() {//缘由https://ask.csdn.net/questions/1102407int x 1, m INT_MAX, n 0, c 0;while (x)cin >> x, (x&&m > x ? m x : 0), n x, (x ? c : 0);cout << "最…

【智路】智路OS air-edge 开发者手册 包管理工具

包管理工具 https://airos-edge.readthedocs.io/zh/latest/airospkg/airospkg.html 功能概述 智路OS包支持部署在智路OS开源版本和智路OS发行版。 智路OS发行版&#xff08;airos distribution&#xff09;是基于智路OS的商业化版本。包括智路OS内核层、系统工具、库、软件…

WPS如何删除表格下的空白页

WPS Office&#xff08;12.1.0.17827&#xff09; ① 鼠标右键&#xff0c;选择段落 ② 行距&#xff1a;固定值&#xff1b;设置值&#xff1a;1磅&#xff1b;取消勾选&#xff0c;确定即可~

Qt与Udp

(1)绑定端口 (2)广播 用udp实现广播通信_udp广播-CSDN博客 数据的发送是面向整个子网的&#xff0c;任何一台在子网中的计算机都可以接收到相同的数据。 如果一台机器希望向其他N台机器发送信息&#xff0c;这时候可以使用UDP的广播。 --------------- 广播地址&#xff1…

《论层次架构及其在软件系统中的应用》写作框架,软考高级系统架构设计师

论文真题 层次架构作为软件系统设计的一种基本模式,对于实现系统的模块化、可维护性和可扩展性具有至关重要的作用。在软件系统的构建过程中,采用层次架构不仅可以使系统结构更加清晰,还有助于提高开发效率和质量。因此,对层次架构的理解和应用是软件工程师必备的技能之一…

C#开发基础之单例模式下的集合数据,解决并发访问读写冲突的问题

1. 前言 在C#中&#xff0c;使用单例模式管理集合数据时&#xff0c;如果多线程同时访问集合&#xff0c;容易产生并发访问的读写冲突问题。单例模式下集合数据的并发访问读写冲突是如何产生的&#xff1f; 单例模式确保一个类在整个应用运行期间只有一个实例&#xff0c;这使…

《华为 eNSP 模拟器安装教程》

1.电脑安装环境要求&#xff1a; 检查电脑是否安装过 eNSP 和依赖软件&#xff0c;如果有&#xff0c;请全部卸载。 安装软件列表&#xff1a; 2.软件安装&#xff1a; 安装 WinPcap&#xff1a; 打开安装包&#xff0c;单击【Next】 单击【I Agree】 单击【Install】 单击【…

supermap iclient3d for cesium场景加载雨雪效果,并加载相应材质

首先新建一个文件夹来存放材质&#xff0c;我选择src/assets/MaterialJson snow.json,复制粘贴,雨雪用一个就行了 {"material": {"id": "DA82AFCB-129A-4E66-995A-9F519894F58D","cullMode": "none","alphaMode"…

OpenCV结构分析与形状描述符(19)查找二维点集的最小面积外接旋转矩形函数minAreaRect()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 找到一个包围输入的二维点集的最小面积旋转矩形。 该函数计算并返回指定点集的最小面积边界矩形&#xff08;可能是旋转的&#xff09;。开发者…

prompt实用技巧-AI+Mermaid【酷炫钉钉文档】

AI 新技能&#xff0c;最近 chatGPTo1 发布后模型能力出现了新的跨越&#xff0c;之前模型的一本正经的胡说八道幻想模式&#xff0c;让AI 对待理科推理明显弱于文案的 AGI 的生成。 prompt engineer 工程师程序员的福音 prompt 内容如下&#xff0c; 按照以上格式生成创建公…

2024年华为9月4日秋招笔试真题题解

2024年华为0904秋招笔试真题 二叉树消消乐好友推荐系统维修工力扣上类似的题--K站中转内最便宜的航班 二叉树消消乐 题目描述 给定原始二叉树和参照二叉树(输入的二叉树均为满二叉树&#xff0c;二叉树节点的值范围为[1,1000]&#xff0c;二叉树的深度不超过1000)&#xff0c…

【信创】Linux上图形化多ping工具--gping的编译安装与打包 _ 统信 _ 麒麟 _ 方德

原文链接&#xff1a;【信创】图形化多ping工具gping的编译安装与打包 | 统信 | 麒麟 | 方德 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在Linux操作系统上使用gping的文章。gping是一款非常实用的命令行工具&#xff0c;它将传统的ping命令进行了可视化改进…

『功能项目』切换职业面板【48】

我们打开上一篇47技能冷却蒙版的项目&#xff0c; 本章要做的事情是切换职业UI面板的功能 首先双击打开Canvas预制体在左上主角面板信息中新建一个button按钮 重命名&#xff08;父物体是按钮Button&#xff0c;子物体Image即可&#xff09; 创建一个Image 设计一下布局 复制三…

窗口嵌入桌面背景层(vb.net,高考倒计时特供版)

开发思路 根据系统生成高考倒计时的具体时间&#xff0c;附加江苏省省统考的时间生成算法&#xff0c;并且用户可以根据实际情况调整前后30天&#xff0c;具有丰富多彩的图片库和强大的自定义功能&#xff0c;效果图见P3 目前程序处于正式版的1.4版本&#xff0c;本程序由本作…