untiy的u3d 角色控制器器怎么控制角色自由移动

UNITY小白--控制角色移动并检测碰到的物体 | indienova 独立游戏
峰峰小 @indienova
UNITY小白--控制角色移动并检测碰到的物体
角色移动的方式是:
不受重力影响
每按下一个按键,移动一格
角色移动一格与下一格之间有休息时间
这里提供的角色移动方式是:每按下一个按键,移动一格角色移动一格与下一格之间有休息时间using System.C
using System.Collections.G
using UnityE
public class move : MonoBehaviour {
public float smoothing=6.0f;
public float restTime = 0.3f;
public float restTimer = 0.0f;
private Vector2 targetPos = new Vector2 (1,1);
private Rigidbody2D
private BoxCollider2D
// Use this for initialization
void Start () {
rb = GetComponent&Rigidbody2D& ();
cd = GetComponent&BoxCollider2D& ();
// Update is called once per frame
void Update () {
void FixedUpdate () {
rb.MovePosition (Vector2.Lerp(transform.position,targetPos,smoothing*Time.deltaTime));
restTimer += Time.deltaT
if (restTimer & restTime)
float h = Input.GetAxisRaw ("H");
float v = Input.GetAxisRaw ("V");
if(h!=0||v!=0){
cd.enabled =
RaycastHit2D hit= Physics2D.Linecast (targetPos,targetPos+new Vector2(h,v));
cd.enabled =
if (hit.transform == null) {
targetPos += new Vector2 (h, v);
switch(hit.collider.tag){
case "outsidewall":
case "insidewall":
hit.collider.SendMessage ("TakeDamage");
case "food":
GameManager.getGM.addHP (10);
targetPos += new Vector2 (h, v);
Destroy (hit.transform.gameObject);
restTimer = 0;
已有 1 人赞过
已有 0 读者收藏
近期点赞的会员
&分享这篇文章
参与此日志的讨论
射线检测 放到fixedupdate 应该好点
您需要登录或者注册后才能发表评论
<div id="success-message" data-notify-position="top-right" data-notify-type="success" data-notify-msg=" 消息已经成功发送!">
<div id="failed-message" data-notify-position="top-right" data-notify-type="error" data-notify-msg=" 操作失败!请通知管理人员。">下次自动登录
现在的位置:
& 综合 & 正文
Unity手游之路角色控制器
我们要控制角色的移动,可以全部细节都由自己来实现。控制角色模型的移动,同时移动摄影机,改变视角。当然Unity也提供了一些组件,可以让我们做更少的工作,实现我们所期望的功能。今天我们就一起系统来学习相关的内容吧。
(转载请注明原文出处)
Charactor Controller(角色控制器)
"角色控制器允许你在受制于碰撞的情况下很容易的进行运动,而不用处理刚体。角色控制器不受力的影响,仅仅当你调用Move函数时才运动。然后它将执行运动,但是受制于碰撞。"(---from unity3d官方文档)
我们通常在人物模型上加上这个组件后,就可以控制模型的移动了。要注意的一点是。加了角色控制器后,他就不受重力影响。所以要自己在move函数中处理重力的情况。即我们要自己出来y轴方向上的速度变化。
两个重要的函数
1.function SimpleMove (speed : Vector3) : bool以一定的速度移动。将忽略Y轴上的速度。单位是m/s。重力被自动应用。建议每帧只调用一次Move或者SimpleMove。返回值是是否着地。例子
2.function Move (motion : Vector3) : CollisionFlags通过动力来移动控制器。动力只受限制于碰撞。它将沿着碰撞器滑动。这个函数不应用任何重力如果只是单纯控制玩家的移动,那么用Character Controller足够了。如果还涉及到视角的切换。Unity提供了相关的组件。在项目中引入Character Controller(Asset-&Import Asset),就可以将角色控制器组件导入我们的项目了。
第一人称控制器
经典的游戏CS就是第一人称视角的,摄像机就是我们的视角。人物的移动,导致视角的移动。(源码first.unity)1.删除默认的摄像机2.新建一个地形Terrain3.从角色控制器组件中引入 First Person Controller到项目中4.拖动First Person Controller到合适的位置我们就可以看到效果了,以第一人称的视角移动,巡视整个场景。鼠标控制整体视角,方向键或者wasd按钮控制摄像机的移动。
第三人称控制器
很多角色扮演游戏(wow,dota)常用到第三人称视角。摄像机离我们的角色保持有一定距离,可以详细看到我们所扮演角色的各种行为动作。(源码third.unity)1.创建一个地形2.引入3rd Person Controller组件到项目中3.修改默认摄像机的Tag为MainCamera4.选中3rd Person Controller组件,将其 Third Person Camera 设置为MainCamera可以看到效果了,可以看到扮演的角色。方向键或者wasd按键可以控制角色的移动,同时可以发现整个视角也会跟着移动
核心代码解读
第一人称控制器脚本FPSInputController.js
[javascript]
第三人称角色控制器ThirdPersonController.js
[javascript]
第三人控制器摄像机脚本ThirdPersonCamera.js
[javascript]
角色控制,可以方便的控制游戏的视角。在很多游戏中,可以直接使用该组件,减少我们的重复开发工作
&&&&推荐文章:
【上篇】【下篇】后使用快捷导航没有帐号?
 论坛入口:
  |   |    |   | 
Unity自定义角色控制器(一):碰撞检测
Unity3D/2D&
QQ截图08.jpg (287.2 KB, 下载次数: 8)
14:36 上传
  GameRes游资网授权发布 文/
  在使用Unity开发了多个项目之后,我得出了两个结论:第一个就是,对于所有对游戏开发感兴趣的人来讲,Unity都是一个非常好的引擎。第二个就是其内建的Character Controller非常糟糕。在关于自定义角色控制器的工作上,已经持续了数周,查找相关资料是非常困难的。自从我找不到可读资料起,我就打算自己写一些资料。计划分享一下自己所学到的以及所处理的问题。在实现方面,我会使用上面提到的Unity游戏引擎来开发。你可以在这里访问他们的,以及这里下载他们最新的。我实在很喜欢用Unity。它在处理很多底层问题的同时有给了开发者很多自由。而且它还有着非常活跃的社区,起到了很大的帮助。
  不幸的是,之前也说了,Unity也带着世界上最糟糕的角色控制器。在与Unity对比之前,这里我阐明一下广义上的角色控制器是什么。其实角色控制器无非就是处理角色与游戏世界碰撞的一堆代码。它不像箱子、栅栏之类的可以有物理引擎统一处理,角色行为上的特殊性需要代码特殊处理。由于我们需要做碰撞检测,我们还是需要选择一个几何形体去表示我们的角色。大多数3D游戏都会选择胶囊体。
1.jpg (65.46 KB, 下载次数: 4)
14:34 上传
  胶囊体的广泛使用有着很多原因,具体原因我们有机会再讨论。现在,为了让问题简单,我们先看看二维情况下的角色控制器。
2.jpg (23.21 KB, 下载次数: 5)
14:34 上传
  你会看到我已经把坐标标记为z轴和y轴,而不是x轴和y轴。这是因为我将会从顶视图来观察这个三维世界。由于顶视图的缘故,那个蓝色圆形是胶囊体。绿色矩形是一堵墙。理想的状况是,角色无法穿过墙壁。因此当角色与墙体交叉时,我希望能够检测出碰撞的发生,然后正确地进行处理。之所以我们自己处理碰撞检测,也就是看看圆形是否与矩形发生了交叉,有两个原因。一个是Unity有相当多的资源(我们后面会讲)来处理这个问题,第二个就是这是一个讲解碰撞检测的好例子。我们将会让碰撞体计算出正确的位置从而得到合理的行为。
3.jpg (33.51 KB, 下载次数: 4)
14:34 上传
  上面展示了我们的角色尝试去朝着墙面运动。为了处理这个问题,我们从角色位移的起点与位移的终点之间进行一次扫略体测试。这次测试的结果是有一面墙在我们的前方,并且返回到墙面的距离。那么我们就可以直接拿到这个距离,将角色按照方向移动所得碰撞距离,从而移动到墙体之前。(PS:Unity有着很多内建的功能可以做到这点,包括Rigidbody.SweepTest,Physics.SphereCast,Physics.CapsuleCast)。
  但是,这并不完全是我们想要的效果。如果我们用了这种方法,角色在与物体稍稍碰撞之后,就再也没有进行任何移动了。问题在于它缺少了现实中的反弹与侧滑。
4.jpg (39.42 KB, 下载次数: 4)
14:34 上传
  这个效果就更加合理一些。最初的扫略测试是在移动方向上进行的。当扫略测试接触到墙体之后,角色就直接移动过去,就像刚才那样。但是这次我们更进一步,让角色向上滑动来补足丢失的移动,这样使得可以沿着表面滑动。这是一个理想中的角色控制器该有的行为,但这不是实现它的最佳方法。首先,这么做效率不是很高:每次你想移动角色,你就需要执行这个函数。如果每帧只执行一次还好,但是假如因为某些原因这个函数要执行多次,那就消耗很大。其次,碰撞处理是依赖于角色移动的方向和距离。如果角色因为某种神奇的原因进入了墙体内部,角色是不会被推出的。实际上,我发现这个问题很让人头疼。
5.jpg (22.25 KB, 下载次数: 4)
14:34 上传
  这是一个糟糕的情况。我们可以看到我们的英雄现在已经在墙体内部了。这种情况下,我们不应该再考虑怎么像之前一样处理碰撞,而是当做一种独立的情况来处理。我们不再关心玩家朝哪个方向移动或者移动了多远。而是我们应该考虑的是,这一刻他应该在哪个位置,这个位置是否存在问题。在上图中,我们可以看到玩家正在与墙体交叉(在墙体内部了),因此他当前位置存在问题,并且需要修正。自从我们不再将处理碰撞检测作为运动的反馈,我们是不知道之前的位置在哪或者移动了多远。而我们所知道的是,他目前卡在墙内,而我们需要将他从墙体内挪出来。但是应该挪到哪里呢?就像之前的例子一样,我们应该在刚接触墙面的时候就将其推出。这里我们有不少候选位置。
6.jpg (34 KB, 下载次数: 4)
14:34 上传
  每个半透明黄色圆圈都指示了一个潜在的满足推出的位置。但是我们应该选择哪个呢?很简单,只要选择距离角色最近的墙面的最近点即可。
7.jpg (31.2 KB, 下载次数: 4)
14:34 上传
  这里我们计算得出距离角色最近点位于右边。接着我们就可以将角色移动到该点,加上角色的半径(红色部分)。
  到这里就结束了我们深入神秘的角色控制器的第一部分。下次,我将会开始谈谈如何在Unity中实现,以及一些角色控制器会用到的更加复杂的函数。
  致谢与引用:
  这里的大多数知识都来源于两个信息源:Unity论坛上的用户techmage以及逆向分析Unity角色控制器包的用户fholm。两个名字都不知道怎么发音。不管怎样,你都可以在这里,在RPGController目录下。这是一个很不错的项目,代码写得很好。很显然,他时做Unity顾问的,如果有谁需要这个服务的话。最后,如果谁有关于这个话题的很好的资源,不妨与我分享一下。
  相关阅读:
关注我们官方微信公众号
下载我们官方APP-游戏行
关注手游动态微信公众号
AppStore大图推荐,轻策略《月圆之夜》上线对“大逃杀”类游戏总局业务主管部门的基本咪咕发布独代手游《时之扉》全IP实施计划盛大游戏李阳:龙之谷服务器设计没有“棋”的棋牌游戏市场iOS单机探险一年流水400万+,7人成团《城堡
微信扫一扫关注我们→当前位置: >
Android 设置角色转身和移动功能
时间: 22:04 来源:Unity之家 作者:unity.jb51.net 浏览:
Android手机上,控制角色方法很多。先为大家展示这一种方法。接下来会为大家展示更多种方法直接为大家贴出代码:
[HideInInspector]&//&不在属性面板中显示
public&bool&facingRight&=&true&;&//&控制角色朝向,默认为右
[HideInInspector]&//&不在属性面板中显示
public&bool&jump&=&true&;&//&判断角色是否跳起
public&float&moveForce&=&365.0F;&//&此变量设置添加刚体的大小
public&float&maxMove&=&5.0F;&&&&&//&设置角色的最大移动速度
void&FixedUpdate()
&&&&#region&设置转身功能
&&&&float&h=Input.GetAxis(&Horizontal&);&//&获取水平输入
&&&&if(h&0&&&&!facingRight)
&&&&Flip();
&&&&else&if(h&0&&&&facingRight&)
&&&&Flip();
&&&&#endregion&设置转身功能
&&&&#region&设置转身功能
&&&&if(h*rigidbody2D.veclocity.x&maxSpeed)
&&&&rigidbody2D.AddForce(Vector.right*h*moveForce);
&&&&if(Mathf.Abs(rigidbody2D.velocity.x)&maxSpeed)
&&&&rigidbody2D.velocity=new&Vector2(Mathf.Sign(rigidbody2D.velocity.x)*maxSpeed,rigidbody2D.velocity.y);
&&&&#endregion&设置转身功能
#region&设置转身功能
void&Flip()
&&&&Vector3&theScale=transform.localS
&&&&theScale.x&*=-1;
&&&&transform.localScale=theS
#endregion&设置转身功能记得留言哟。。。
(责任编辑:脚印)
免责声明:Unity之家部分内容来源于互联网,如有侵权,请联系我们,本站将立即进行处理。
猜你也喜欢看这些 ??????
其他类型的Unity入门 ??????Unity3D游戏开发之自由视角下的角色控制;今天呢,继续来探讨Unity3D角色控制的内容,;在开始今天的内容前,首先让我们来学习下Unity;1、Input.GetAxis():该方法用于在;????????????????????;usingUnityEusingSy;publicclassexample:MonoB;//水平速度;publ
Unity3D游戏开发之自由视角下的角色控制
今天呢,继续来探讨Unity3D角色控制的内容,自由视角是指玩家可以按照自身坐标系向着四个不同的方向移动,当玩家按下鼠标右键时,可以绕Y轴按照一定的角度旋转摄像机,在旋转的过程中,角色将旋转相应的角度。在移动的过程中,摄像机会保持与玩家间的一定距离,然后跟随角色进行移动。好了,下面我们正式开始今天的内容吧!
在开始今天的内容前,首先让我们来学习下Unity3D中较为重要的一部分知识,理解这些知识是我们开始学习今天内容的基础。
1、Input.GetAxis():该方法用于在Unity3D中根据坐标轴名称返回虚拟坐标系中的值,通常情况下,使用控制器和键盘输入时此值范围在-1到1之间。这段话怎么理解呢?我们来看下面这段脚本:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? using UnityE
using System.C
public class example : MonoBehaviour {
//水平速度
public float HorizontalSpeed = 2.0F;
//垂直速度
public float VerticalSpeed = 2.0F;
void Update()
//水平方向
float h = HorizontalSpeed * Input.GetAxis(\
//垂直方向
float v = VerticalSpeed * Input.GetAxis(\
transform.Rotate(v, h, 0);
这段脚本呢是根据鼠标的位置来旋转物体从而实现对物体的观察,从这段脚本中我们可以看出,通过获取输入轴的办法,我们可以获得鼠标移动的方向进而实现对于物体的旋转控制。在Unity3D中我们可以通过Edit->Project Setting->Input来查看项目中的坐标轴名称:
在后面,我们还将使用这种方式,大家可以对这个方法有进一步的了解。
2、欧拉角eulerAngles:该值是Vector3类型的值,x、y、z分别代表绕x轴旋转x度,绕y轴旋转y度,绕z轴旋转z度。因此,该值最为直观的形式是可以允许我们直接以一个三维向量的形式来修改一个物体的角度,例如下面的脚本:
[html] view plaincopy
? float mY = 5.0;
? ? ? ? ? ?
void Update ()
mY += Input.GetAxis(\
transform.eulerAngles =new Vector3(0,mY, 0);
如果你已经理解了上面的话,那么不出意外的,这段脚本会如你所愿的,按照鼠标在水平方向上移动的方向绕Y轴旋转。通常情况下,我们不会单独设置欧拉角其中一个轴,例如eulerAngles.x = 10,因为这将导致偏移和不希望的旋转。当设置它们一个新的值时,要同时设置全部。好在我们可以通过Quaternion.Euler()方法将一个Vector3类型的值转化为一个四元数,进而通过修改Transform.Rotation来实现相同的目的。
3、插值:所谓插值是指在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点。插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。在某些情况下,如果我们希望过程中处理得较为平滑,此时我们就可以使用插值的方法来实现对中间过程的模拟。在Unity3D中我们可以使用两种插值方法,即线性插值Lerp,球形插值SLerp。我们来看下面的脚本:
? ? ? ? ? ? void Rotating (float horizontal, float vertical)
// Create a new vector of the horizontal and vertical inputs.
Vector3 targetDirection = new Vector3(horizontal, 0f, vertical);
// Create a rotation based on this new vector assuming that up is the global y axis.
Quaternion targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up);
// Create a rotation that is an increment closer to the target rotation from the player's rotation.
Quaternion newRotation = Quaternion.Lerp(rigidbody.rotation, targetRotation, turnSmoothing * Time.deltaTime);
// Change the players rotation to this new rotation.
rigidbody.MoveRotation(newRotation);
插值的方法很简单,只要我们给出初始和结束的状态、时间就可以了,大家可以自己看API。文章出处狗刨学习网
好了,有了这三部分的基础,我们就可以开始今天的内容了,今天的脚本分为两个部分,第一部分是角色控制的部分,主要负责的角色在场景中的移动、转身和动画处理。第二部分是相机控制的部分,主要涉及相机旋转、相机缩放的相关内容。下面,我们分别来讲这两个部分,场景依然是博主自己在做的小游戏:
三亿文库包含各类专业文献、生活休闲娱乐、专业论文、文学作品欣赏、外语学习资料、中学教育、各类资格考试、高等教育、幼儿教育、小学教育、应用写作文书、95Unity3D游戏开发之自由视角下的角色控制等内容。 
 类型来控制这个动 画的播放,然后点击状态跟状态之间的连线,会出现如下界面 ④ ...Unity3D游戏开发之自由视... 暂无评价 22页 免费 unity3d游戏开发之角色的.....  本科生毕业设计(论文)开题报告 毕业设计题目:基于 Unity3D 引擎的“风之幻想”角色 扮演游戏设计与开发 学 院: 信息科学与工程学院 专业班级: 计算机科学与技术 ...  Unity3D 游戏开发之自由视角下的角色控制 今天呢,继续来探讨 Unity3D 角色控制的内容,自由视角是指玩家可以按照自身坐 标系向着四个不同的方向移动,当玩家按下...  Unity3D技术学习之自由视角下的角色控制_互联网_IT/计算机_专业资料。Unity3D技术...如图是博主非常喜欢的《古剑奇谭》游戏截 图,在这款游戏中就使用了博主今天要...  Unity3D游戏开发之仿仙剑奇侠传角色控制效果_计算机...这里代码的作用是当用户按下鼠标右键旋转视角时, ...Unity3D游戏开发之自由视... 暂无评价 23页 免费 ...  Unity3D 游戏开发之射线、角色控制器 角色控制器(character controller) 角色控制器允许你在受制于碰撞的情况下很容易的进行运动,而不用处理 刚体。角色控制器不受...  unity3D 封装了一个非常好用的组件来实现第一人称视角与第三人称视角游戏开发,我们 称他为角色控制器组件,几乎不用写一行代码就可以完成一切的操作,神奇吧。使用...  一、角色控制器(Charactor Controller)角色控制器允许你在受制于碰撞的情况下很...Unity3D 封装了一个非常好用的组件来实现第一人称视角与第三人称视 角游戏开发...

我要回帖

更多关于 unity角色控制器碰撞 的文章

 

随机推荐