Unity3D之鼠标控制角色移动与奔跑示例

news2024/8/28 12:28:31

​    看到这个标题我相信大家应该并不陌生,一般在PC网络游戏中玩家通过鼠标左键在游戏世界中选择角色目标移动位置,接着主角将面朝点击的那 个方向移动。首先就本文来说我们应当掌握的知识点是“鼠标拣选”。这是什么概念呢?其实很简单,就是玩家通过鼠标在Game视图中选择了一个点,需要得到 该点在3D世界中的三维坐标系。
Game视图是一个2D的平面,所以鼠标拣选的难点就是如何把一个2D坐标换算成3D坐标。我 们可以使用射线的原理很好的解决这个问题,在平面中选择一个点后从摄像机向该点发射一条射线。
判断:选择的这个点是否为地面,如果是地面拿到这个点的3D 坐标即可。如下图所示,在场景视图中我们简单的制作了带坡度的地形,目标是用户点击带坡度或不带坡度的地形都可以顺利的到达目的地。

操作方法

  • 01

    本文依然使用角色控制器组件,不知道这个组件的朋友请看MOMO之前的文章。因为官方提供的脚本是JavaScript语言。MOMO比 较喜欢C#所以放弃了在它的基础上修改,而针对本文的知识点重写编写脚本,这样也方便大家学习,毕竟官方提供的代码功能比较多,代码量也比较多。废话不多 说了进入正题,首先在将模型资源载入工程,这里没有使用官方提供的包,而直接将模型资源拖拽入工程。如下图所示,直接将角色控制器包中的模型资源拖拽如层次视图当中。

  • 02

    在Project视图中鼠标右键选择Import  Package ->Script引入官方提供的脚本,这些脚本主要是应用于摄像机朝向的部分。首先在Hierarchy视图中选择摄像机组件,接着在导航栏菜单中 选择Compont -> Camera-Control ->SmoothFollow脚本。实际意义是将跟随脚本绑定在摄像机之上,目的是主角移动后摄像机也能跟随主角一并移动。如下图所示,脚本绑定完 毕后可在右侧监测面板视图中看到Smooth Follow脚本。Target 就是射向摄像机朝向的参照物,这里把主角对象挂了上去意思是摄像机永远跟随主角移动。

  • 03

    由于官方提供的脚本并不是特别的好,摄像机永远照射在主角的后面,以至于控制主角向后回头时也无法看到主角的面部表情,所以MOMO简单的修改一下这条脚本,请注意一下我修改的地方即可。 SmootFollow.js 01   // The target we are following 02vartarget : Transform; 03// The distance in the x-z plane to the target 04vardistance = 10.0; 05// the height we want the camera to be above the target 06varheight = 5.0; 07// How much we 08varheightDamping = 2.0; 09varrotationDamping = 3.0; 10 11// Place the script in the Camera-Control group in the component menu 12@script AddComponentMenu("Camera-Control/Smooth Follow") 13 14functionLateUpdate () { 15    // Early out if we don't have a target 16    if(!target) 17        return; 18 19    // Calculate the current rotation angles 20    varwantedRotationAngle = target.eulerAngles.y; 21    varwantedHeight = target.position.y + height; 22 23    varcurrentRotationAngle = transform.eulerAngles.y; 24    varcurrentHeight = transform.position.y; 25 26    // Damp the rotation around the y-axis 27    currentRotationAngle = Mathf.LerpAngle (currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime); 28 29    // Damp the height 30    currentHeight = Mathf.Lerp (currentHeight, wantedHeight, heightDamping * Time.deltaTime); 31 32    // Convert the angle into a rotation 33 34    //下面是原始代码。 35    //var currentRotation = Quaternion.Euler (0, currentRotationAngle, 0); 36 37    //这里是我修改的,直接让它等于1, 38    //摄像机就不会旋转。 39    varcurrentRotation = 1; 40 41    // Set the position of the camera on the x-z plane to: 42    // distance meters behind the target 43    transform.position = target.position; 44    transform.position -= currentRotation * Vector3.forward * distance; 45 46    // Set the height of the camera 47    transform.position.y = currentHeight; 48 49    // Always look at the target 50    transform.LookAt (target); 51   }

  • 04

    下面我们给主角模型添加角色控制器组件,请先把自带的控制摄像机与镜头的控制脚本删除。如下图所示主角对象身上挂着Character Controller(角色控制器组件)即可,Controller是我们自己写的脚本,用来控制主角移动。 下面看一下Controller.cs完整的脚本,脚本中我们将主角共分成三个状态:站立状态、行走状态、奔跑状态。默认情况下主角处于站立状态,当鼠标选择一个目标时,主角将进入行走状态面朝目标方向行走。当连续按下鼠标左键时主角将进入奔跑状态朝向目标方向奔跑。 001   usingUnityEngine; 002usingSystem.Collections; 003 004publicclassController : MonoBehaviour 005{ 006 007    //人物的三个状态 站立、行走、奔跑 008    privateconstintHERO_IDLE = 0; 009    privateconstintHERO_WALK = 1; 010    privateconstintHERO_RUN = 2; 011 012    //记录当前人物的状态 013    privateintgameState = 0; 014 015    //记录鼠标点击的3D坐标点 016    privateVector3 point; 017    privatefloattime; 018 019    voidStart () 020    { 021        //初始设置人物为站立状态 022        SetGameState(HERO_IDLE); 023 024    } 025 026    voidUpdate () 027    { 028        //按下鼠标左键后 029        if(Input.GetMouseButtonDown(0)) 030        { 031            //从摄像机的原点向鼠标点击的对象身上设法一条射线 032            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 033            RaycastHit hit; 034            //当射线彭转到对象时 035            if(Physics.Raycast(ray, outhit)) 036            { 037                //目前场景中只有地形 038                //其实应当在判断一下当前射线碰撞到的对象是否为地形。 039 040                //得到在3D世界中点击的坐标 041                point = hit.point; 042 043                //设置主角面朝这个点,主角的X 与 Z轴不应当发生旋转, 044                //注解1 045                transform.LookAt(newVector3(point.x,transform.position.y,point.z)); 046 047                //用户是否连续点击按钮 048                if(Time.realtimeSinceStartup - time <=0.2f) 049                { 050                        //连续点击 进入奔跑状态 051                        SetGameState(HERO_RUN); 052                }else 053                { 054                        //点击一次只进入走路状态 055                        SetGameState(HERO_WALK); 056                } 057 058                //记录本地点击鼠标的时间 059                time = Time.realtimeSinceStartup; 060            } 061        } 062    } 063 064    voidFixedUpdate() 065    { 066 067        switch(gameState) 068        { 069        caseHERO_IDLE: 070 071            break; 072        caseHERO_WALK: 073            //移动主角 一次移动长度为0.05 074            Move(0.05f); 075            break; 076 077        caseHERO_RUN: 078            //奔跑时移动的长度为0.1 079            Move(0.1f); 080            break; 081        } 082 083    } 084 085    voidSetGameState(int  state) 086    { 087        switch(state) 088        { 089        caseHERO_IDLE: 090            //播放站立动画 091            point = transform.position; 092            animation.Play("idle"); 093            break; 094        caseHERO_WALK: 095            //播放行走动画 096            animation.Play("walk"); 097            break; 098        caseHERO_RUN: 099            //播放奔跑动画 100            animation.Play("run"); 101            break; 102        } 103        gameState = state; 104    } 105 106    voidMove(floatspeed) 107    { 108 109        //注解2 110        //主角没到达目标点时,一直向该点移动 111        if(Mathf.Abs(Vector3.Distance(point, transform.position))>=1.3f) 112        { 113            //得到角色控制器组件 114            CharacterController controller  = GetComponent<CharacterController>(); 115            //注解3 限制移动 116            Vector3 v = Vector3.ClampMagnitude(point -  transform.position,speed); 117            //可以理解为主角行走或奔跑了一步 118            controller.Move(v); 119        }else 120        { 121            //到达目标时 继续保持站立状态。 122            SetGameState(HERO_IDLE); 123        } 124    } 125 126   }

  • 05

    ​祝大家学习愉快哇咔咔!最终效果如图所示,MOMO双击鼠标在3D中选择了一个目标点,主角正在努力的向该点奔跑。

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

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

相关文章

《泽诺尼亚4:ZENONIA 4》攻略:称号大全

诺尼亚传奇4攻略,泽诺尼亚传奇4作为一款角色扮演游戏,其丰富的剧情,4种各具特色的职业,技能和属性培养等等都堪称角色扮演类中的经典。除去单机模式外,更是有PVP竞技场和试炼之塔挑战。在这里介绍泽诺尼亚传奇4攻略德鲁伊的双系走向和技能加点,希望对各位泽诺尼亚传奇4玩…

如何找到并设置华为手机截屏功能

现在有很多人在使用华为手机,有些新用户不知道如何找到并设置截屏功能,接下来小编就给大家介绍一下具体的操作步骤。具体如下:1. 首先第一步先打开【设置】窗口,接着根据下图箭头所指,点击【辅助功能】选项。2. 第二步在【辅助功能】页面中,根据下图箭头所指,点击【快捷…

微信中的通过手机号给好友转账怎么操作

微信中的通过手机号给好友转账怎么操作呢?其实很简单,但是有一个前提就是对方必须开通了‘允许通过手机号向我转账’功能才能操作。一起来看看吧。1. 首先解锁手机,打开微信APP并登陆,在主页右下角选择‘我’进入;2. 进入我的界面后,选择‘支付’选项进入;3. 进入支付之…

Photoshop PS如何去除人脸上的瑕疵

PS最大的功能就是修改剪辑照片,今天给大家介绍一下Photoshop PS如何去除人脸上的瑕疵的具体操作步骤。1. 打开电脑,双击“ps软件”打开。2. 接着在左上角选择文件,然后在选项里选择“打开”,将需要处理的图片打开。3. 接着选择左侧工具栏的“污点修复画笔工具”4. 然后按照…

微信小程序如何根据明星照片识别明星姓名

今天给大家介绍的是微信小程序如何根据明星照片识别明星姓名的具体操作步骤。1. 首先打开并登陆微信,然后在程序搜索框输入“识图取字.”2. 在搜索结果中看到“明星脸”点击其右侧的“开始.”3. 然后进入小程序,看到两个功能:“传图找明星”、“我是明星脸“我们选择传图找明…

AE如何设置滚动数字特效

AE如何设置滚动数字特效呢?下面就一起看看吧。1.打开ae, 然后新建一个合成,长宽为800*600。帧数率为30帧/秒,时间以5秒为例2. 接下来在时间轴的左边空白的地方依次右键---新建---纯色3. 纯色层大小同样是800px*600px,颜色是#2AC2EA,形成一个蓝色的背景,如图。4. 接下来我…

苹果手机如果解决App Store无法下载软件

我们在使用苹果手机的过程中可以发现,App Store是苹果手机非常重要的软件,接下来小编就教大家怎么解决App Store无法下载软件的问题。具体如下:1首先我们可以尝试长按电源键关机重启。 2第二种方法在手机桌面找到设置图标,打开之后找到通用选项,然后找到还原选项点击打开。…

电脑如何进行在线识别图片中文字

有的时候我们需要将图片中的文字输入到电脑中,但我们又不可能一个一个将文字打出来。那么我们就需要使用到在线文字识别,接下来小编就教大家怎样操作。具体如下:1. 首先我们需要在电脑上下载文字识别的软件,如果已经下载了那么我们直接就可以打开电脑。2. 进入到电脑桌面之…

怎么在vivo手机内同时登陆两个微信号

当我们在使用vivo手机的时候,可以下载微信来与好友取得联系,但如果有的人需要同时登陆两个微信号的话,应如何进行设置呢?接下来就由小编来告诉大家。具体如下:1. 第一步,打开手机并在桌面找到设置图标,点击进入。2. 第二步,进入设置页面后点击下方的应用分身选项。3. 第…

怎么在手机拼多多app中将微信免密支付开启?

如今许多小伙伴都喜欢在拼多多上跟好友一起拼单买东西,如果我们想要将微信免密支付开启免去输入支付密码的麻烦应该如何操作呢?今天,小编就教大家在手机拼多多app中将微信免密支付开启。具体如下:1.首先,我们将手机中的拼多多软件打开,在首页的位置点击右下角的“个人中心…

如何查看新浪微博里的个人历史搜索记录

我们通常喜欢看新浪微博,但是有的用户想查看自己的历史搜索记录,怎么操作呢?小编为大家介绍方法。方法一1. 首先,请大家在自己的手机中找到【微博】,点击进入,然后选择底部的【发现】。2. 第二步,接下来,请点击顶部的搜索框。3. 第三步,如图所示,其中出现了自己搜索过…

怎么将一台设备中的微信聊天记录迁移到另一台设备

有的小伙伴在更新微信系统或者更换手机时,为了防止丢失重要的聊天记录,因此想要将一台设备中的微信聊天记录迁移到另一台设备,但是却不知道如何迁移,那么小编就来为大家介绍一下吧。具体如下:1.第一步,点击并打开微信软件。2. 第二步,来到微信软件主页面后,点击右下角的…

如何备注华为手机内的照片

当我们在使用华为手机的时候,可以拍摄许多的相片,那么如果想要对照片进行备注的话,应如何操作呢?接下来就由小编来告诉大家。具体如下:1.第一步,打开华为手机内的相册功能,进入相册主页后,点击下方的相册选项。2. 第二步,跳转至相册页面后,选择要进行备注的图片。3. …

手机高德地图软件中附近的洗车行怎么查询

有的小伙伴在使用高德地图软件时,想要查询附近的洗车行来洗车,但是却不知道如何查询,那么小编就来为大家介绍一下吧。具体如下:1. 第一步,点击并打开高德地图软件。2.第二步,来到高德地图软件主页面后,点击左上角的个人头像。3. 第三步,在下图所示的个人中心页面中,点…

电脑端qq取消订阅腾讯视频如何设置?

我们知道,每当我们登录qq时都会有一堆订阅号消息,有的时候让我们感觉很烦躁,那么如何取消订阅腾讯视频呢?下面来和小编一起看看吧!具体如下:1. 第一步,点击打开腾讯qq,2. 第二步,在如图所示的主界面,我们需要点击左下角的“更多”选项图标按钮,3. 第三步,在展开的菜…

电脑端QQ怎么将字体选择设置为气泡模式

用惯了手机QQ的气泡模式,那么不妨把电脑也修改一下吧。今天小编就告诉大家电脑端QQ怎么将字体选择设置为气泡模式。具体如下:1. 打首先我们打开电脑中的QQ,输入账号密码进行登录。2. 进入主界面之后点击一个好友进入聊天窗口,点击窗口中如图所示的图标。3. 在打开的窗口中我…

电脑端QQ“只能通过账号或昵称找到我”功能在哪里?怎么开启

QQ是我们经常使用的软件之一。今天小编跟大家分享的是电脑端QQ如何设置只能通过账号或昵称找到我。具体如下:1. 首先我们打开电脑上的QQ,输入账号和密码进行登录。2. 登录成功之后我们就会打开QQ界面。我们点击左下角“三”图标,在弹出的窗口中点击设置选项。3. 芝后门会进入…

拼多多app怎么使用开抢提醒?

拼多多很多秒杀限量的东西都不好抢,去晚了抢不到,我们可以设置开抢提醒,会提前提醒我们去抢宝贝,下面我们就来看看详细的设置方法。 1)点开拼多多APP,首先在首页中选择自己感兴趣的类别,在进入相关页面后便能看到&ldquo;精选&rdquo;中的抢购商品;(如下图)2)…

拼多多如何参与别人的拼单 拼多多APP多人拼单的具体流程

拼多多是目前比较流行的一款拼单团购平台,用户在此平台上购物区可以和其他人拼单,这样会更划算。下面小编就给大家详细介绍用拼多多APP进行团购的具体流程,有需要的小伙伴可以参考。 怎么用拼多多APP拼单购物? 1、打开拼多多APP,登录帐号,进入页面,按照自己想要参与的活…

如何开通手机拼多多app内的省钱月卡

随着科技的发展,网购已经成为人们日常生活中必不可少的一部分,现如今网购平台也是越来越多,除了淘宝、天猫、京东外,拼多多也是越来越火,当我们在使用拼多多进行购物时,为了节省更多的钱,可以开通省钱月卡,接下来就由小编来告诉大家如何操作。具体如下:1.第一步,打开…