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

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}}
}

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 安全区域边界等保测评
  • 基于HPLC的低压电力采集方案
  • 通过 Docker 部署 WordPress 服务器
  • 【C++】STL--string(上)
  • 通俗理解矩阵的秩
  • 浅谈树型结构——树
  • 通信工程学习:什么是UNI用户网络接口
  • unity3d入门教程七
  • 黑马十天精通MySQL知识点
  • DAY13信息打点-Web 应用源码泄漏开源闭源指纹识别GITSVNDS备份
  • lvs-dr模式实验详解
  • C++IO流
  • uni-app 应用名称 跟随系统语言 改变
  • 计算机毕业设计hadoop+spark+hive物流预测系统 物流大数据分析平台 物流信息爬虫 物流大数据 机器学习 深度学习
  • [PICO VR眼镜]眼动追踪串流Unity开发与使用方法,眼动追踪打包报错问题解决(Eye Tracking)
  • @angular/forms 源码解析之双向绑定
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • Android Volley源码解析
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • angular2 简述
  • java正则表式的使用
  • python docx文档转html页面
  • Python打包系统简单入门
  • rabbitmq延迟消息示例
  • React+TypeScript入门
  • vagrant 添加本地 box 安装 laravel homestead
  • Vim 折腾记
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 排序(1):冒泡排序
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何实现 font-size 的响应式
  • 数组大概知多少
  • 双管齐下,VMware的容器新战略
  • 项目实战-Api的解决方案
  •  一套莫尔斯电报听写、翻译系统
  • 在Unity中实现一个简单的消息管理器
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (AngularJS)Angular 控制器之间通信初探
  • (function(){})()的分步解析
  • (附源码)ssm码农论坛 毕业设计 231126
  • (译) 函数式 JS #1:简介
  • (转载)深入super,看Python如何解决钻石继承难题
  • .describe() python_Python-Win32com-Excel
  • .net core控制台应用程序初识
  • .NET 回调、接口回调、 委托
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET开发者必备的11款免费工具
  • .NET序列化 serializable,反序列化
  • .net中我喜欢的两种验证码
  • /3GB和/USERVA开关