Unity3D学习记录04——利用射线实现角色类似LOL的移动

这篇具有很好参考价值的文章主要介绍了Unity3D学习记录04——利用射线实现角色类似LOL的移动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先新建一个空白的GameObject,挂在一个MouseManager的脚本

实现思路:

通过获取鼠标点击的位置,获得该位置的信息,然后使角色移动到该位置

MouseManager脚本的代码如下:

 1 using System;
 2 using System.Collections;
 3 using System.Collections.Generic;
 4 using UnityEngine;
 5 using UnityEngine.Events;
 6 
 7 public class MouseManager : MonoBehaviour
 8 {
 9     public event Action<Vector3> OnMouseClicked;//声明一个Action<Vector3>类型的事件
10     public RaycastHit hitInfo;//RaycastHit类型的变量,可以返回射线碰撞的的信息
11     public static MouseManager Instance;
12     public Texture2D attack, b, c, d, target;
13 
14     void Awake()
15     {
16         if (Instance != null)
17         {
18             Destroy(gameObject);
19         }
20         Instance = this;
21     }
22     void Update()
23     {
24         SetCursorTexture();
25         MouseControl();
26     }
27     void SetCursorTexture()
28     {
29         Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
30         if (Physics.Raycast(ray, out hitInfo))
31         {
32             //切换鼠标贴图
33             switch (hitInfo.collider.gameObject.tag)
34             {
35                 case "Ground":
36                     Cursor.SetCursor(target, new Vector2(16, 16), CursorMode.Auto);
37                     break;
38                 case "Enemy":
39                     Cursor.SetCursor(attack, new Vector2(16, 16), CursorMode.Auto);
40                     break;
41             }
42         }
43     }
44     void MouseControl()
45     {
46         if (Input.GetMouseButtonDown(0) && hitInfo.collider != null)
47         {
48             if (hitInfo.collider.CompareTag("Ground"))
49                 OnMouseClicked?.Invoke(hitInfo.point);
50         }
51     }
52 }

 

代码解释:

先创建了一个Action类型的事件OnMouseClicked

这个是C#中事件的内容,我们可以在满足条件的时候自动触发这个OnMouseClicked的事件

 

接着我们声明两个函数,一个是SetCursorTexture,一个是MouseControl

第一个函数中,我们声明一个射线的对象ray,并且用Camera.Main.ScreenPointToRay()获取从摄像机通过屏幕点的光线

ScreenPointToRay()的参数为鼠标点击的位置,这样我们的对象ray就获得了我们鼠标点击的位置信息

Raycast回返回一个bool值,我这边用了两个参数,一个是我们的射线ray,一个是out的hitInfo,也就是返回的信息

那么当我们返回值为true的时候,我们会有一个切换鼠标贴图的效果

其中SetCursor中有个参数是偏移量,也就是上述代码中的new Vector2,因为鼠标指针判定是在左上角的,调节适当的偏移量,可以使你变换后的指针可以使其作用点在中心

(PS:我声明的几个Texture2D中,有几个没有意义的字母,是留着备用的,目前还没想到哪些功能需要使用)

 

第二个函数MouseControl的第一个if中,

我们如果鼠标按下了左键(函数的参数0即为鼠标左键,1为鼠标右键)并且我们射线碰撞不为空,

那么我们执行第二个if,第二个if表示 我们射线碰撞到的物体tag为Ground,那么我们执行OnMouseClicked函数

?.Invoke表示如果这个函数不为空,那么我们执行这个函数,和!=null是一个意思,这个写法较为便捷

Invoke中我们需要传入一个Vector3的参数,即为碰撞的Point

最后我们需要在Unity中设置一下我们Ground的Tag

 

至于鼠标切换贴图,需要在Unity里面进行操作:

先选中自己需要作为鼠标贴图的图片,打开Inspector窗口,设置为Cursor

下方的Max Size可以调整鼠标贴图的大小

Unity3D学习记录04——利用射线实现角色类似LOL的移动

 

 

关于射线的Unity 官方的API手册如下:

Unity3D学习记录04——利用射线实现角色类似LOL的移动

 

 

Unity3D学习记录04——利用射线实现角色类似LOL的移动

 

翻译

搜索

复制文章来源地址https://www.toymoban.com/news/detail-711013.html

到了这里,关于Unity3D学习记录04——利用射线实现角色类似LOL的移动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity3D学习记录01:URP渲染管线以及3D游戏场景设置

    以下内容所使用的版本均为Unity2022.3 先在 Window-Package Manager-Unity Registry 里面搜索添加Universal RP   Unity中,创建渲染管线的方式为Asset文件夹下右键 Create-Readering-URP Asset(with Universal Asset) 会创建以下两个Pipeline:  接着在图中的设置里添加这两个渲染管线(Project Setting在Edit窗口下

    2024年02月08日
    浏览(63)
  • 【Unity3D-01】 记录Unity3D调用外接摄像头

    最近想在Unity3D上调用一个摄像头,通过查找资料发现仙魁XAN和八哥快走开的博客符合我的想法,实现起来也不难就尝试了一下 2.1 在这个工程里新建Canvas 如下图所示 然后下设RawImage为载体 2.2 在Assets里面新建一个脚本命名为PlaneManager.cs 代码内容如下(参考八哥快走开的博客)

    2024年02月04日
    浏览(54)
  • Unity3D 记录到日志

    记录日志是一个好习惯,方便我们在日常开发中出现问题快速排查。 把它放到Unity Project视图下,最好是建一个“Plugins”文件夹用来存放,在脚本中引用该类库。 下载链接:https://download.csdn.net/download/WenHuiJun_/87658498 原文: https://www.ngui.cc/el/1788499.html?action=onClick 注: 对于 “

    2024年01月21日
    浏览(55)
  • Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)

    在开发UI滚动列表的时候,经常会有每项的背景图不统一的情况,会间隔重复的情况居多。这种情况下,手动去设置间隔一行的背景图或者颜色是比较麻烦的。在此背景下,笔者尝试写个小工具,在搭建UI时配置一下循环背景的样式,可以通过一键点击后设置UI背景的样式,省

    2024年02月03日
    浏览(52)
  • 【Unity3D自学记录】开发PicoVR之获取手柄的方法

    获取手柄有两种方法,一种是XR的方法,一种是PicoSDK中的方法。 第一种,XR方法 第二种是PicoSDK中的方法

    2024年02月17日
    浏览(47)
  • Linux Ubuntu18.04配置Unity3D开发环境并解决VSCode中Dotnet Mono Omnisharp等问题实现MonoBehaviour代码提示

    如果说Windows安装Unity3D、配置Unity3D开发环境已经让人头疼。那么,Linux中搭建Unity3D开发环境就更加让人癫狂了。网上这类教程很少,出现问题都找不到现成的解决方法,很多坑都是自己不断尝试,填补过来的。大致分为以下几个坑:1.Ubuntu18.04配置Unity3D软件不成功;2.VSCode识别

    2024年02月14日
    浏览(54)
  • Unity3d C#利用本地网页快速打开萤石云监控视频流(ezopen)实现云台,声音等控制,支持WebGL平台,替代UMP播放(含源码)

    之前我介绍了替代Universal?Media?PlayerUMP播放石云监控视频流(ezopen)的功能,效果还是很明显的,笔者的测试是差不多3-5秒就能打开监控画面,不过稍微遗憾的是,之前的功能是iframe打开石云提供的播放网页的形式,功能基本只有画质切换,声音开关等;具体可以移步查看(https

    2024年02月13日
    浏览(61)
  • Unity3D学习笔记——物理引擎

    1简介 刚体可以为游戏对象赋予物理特性,是游戏对象在物理系统的控制下接受推力和扭力,从而实现现实世界的物理学现象。 2属性 1简介 碰撞器是物理组件的一类,他与刚体一起促使碰撞发生 碰撞体是简单形状,如方块、球形或者胶囊形,在 Unity 3D 中每当一个 GameObjects

    2023年04月12日
    浏览(51)
  • [Unity3D] 记录一下ScrollView中粒子无法被Mask遮挡的问题解决过程

    项目解决问题1所使用的Shader链接:https://www.codenong.com/cs107033982/ 解决思路: 1、粒子特效使用的Mobile/Particles/Additive(Shader)材质球不包含模板测试,添加模板测试后可以与普通Image一样被Mask遮挡,所以我们给粒子的材质球加上模板测试。 2、普通Image使用默认的材质球,该材质球

    2024年02月07日
    浏览(50)
  • Unity3D实现给3D物体添加文本标签

    本教程将向您展示如何通过编写脚本来实现在Unity3D中给3D物体添加文本标签的通用方法。了解如何创建文本标签预制体,并通过编写脚本将其添加到3D物体上,以提供更多信息或标识物体。

    2024年02月04日
    浏览(179)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包