首先要导入unity标准资源包Character Controllers 这个标准资源包,为了方便,还添加了两外一个资源包Scripts,后者包含了一些基本的脚本个摄像机脚本。

没错,这次我们要使用其中一个摄像机脚本, 创建一个terrain (地形ller组件(如),创建一个capsule ,并为这个胶囊提添加 CharactContro果没有导入角色标准资源包的话竟不能被添加该组件),注意只是一个CharactController 组件而已。

当我们点击 add Component——Character的时候会有以下三个选项,第一个是第一人称视角,后面两个是第三人称视角。有什么区别,还没有去研究:

比如我们添加了第一个“CharacterMotor” ,添加以后系统自动为我们添加了包含 CharactorController 组件在内的两个组件。这里我们只需要CharacterController 这个组件,要把另外一个删除掉。如果添加了后面两个“FPS Input Controller” 或者 “Platform Input Controller”同样也是要删除多余的只剩下 CharacterController  这个组件。因为我们只是用到了

CharacterController.Move这个函数

function Move (motion : Vector3) : CollisionFlags

对这个函数的描述我也没看太懂,大概是按照参数的方向移动了参数的长度、、、、、、吧0.0

这个组件只是为控制他移动提供了基础。要想实现移动还要我们添加一个移动的脚本,于是这个叫做 MyController 的脚本诞生了。

上代码:

 using UnityEngine;
using System.Collections; public class MyController : MonoBehaviour {
private Vector3 mousePoint;
public float speed=0.1f;
// Use this for initialization
void Start () { } // Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown()) {
Ray myRay=Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit; if (Physics.Raycast(myRay,out hit)) {
mousePoint=hit.point;
transform.LookAt(new Vector3(mousePoint.x,transform.position.y,mousePoint.z) );
} print(Vector3.Distance(mousePoint,transform.position));
}
Move(speed);
} void Move(float speed)
{
if (Mathf.Abs(Vector3.Distance(transform.position,mousePoint))>=1f) { CharacterController controller = GetComponent<CharacterController>();
Vector3 v=Vector3.ClampMagnitude(mousePoint-transform.position,speed);
controller.Move(v);
}
else
{
Debug.Log("已到达终点");
} }
}

第 30行 Vector3.Distance 这个函数的解释:

static function Distance (a : Vector3, b : Vector3) : float

这个函数返回 a、b 两点之间的距离,这个距离永远是正值!!

官方的解释,这个函数等同于(a-b).magnitude而(a-b).magnitude是怎么计算的呢?看下面:

Vector3.magnitude

返回向量的长度(只读)。向量的长度是(x*x+y*y+z*z)的平方根。

由此可知。返回永远都不可能是负值。

所以,代码中第30行的 Mathf.Abs  取绝对值的函数是没有必要的。

另外第33行也有一个函数:

Vector3.ClampMagnitude

这个函数的描述:

static function ClampMagnitude (vector : Vector3, maxLength : float) : Vector3

返回向量的长度,最大不超过maxLength所指示的长度。

也就是说,钳制向量长度到一个特定的长度。

呦描述可知,该方法返回了一个vector3类型的值,这个向量可以看做是第一个参数的副本,但是有一点:它的长度被第二个参数限制了。

下面来看看run 的结果:

无法上传运行图片。。。晕

unity——使用角色控制器组件+射线移动的更多相关文章

  1. [unity3d]角色控制器组件相互间不碰撞

    RPG游戏会有这种需求. 队友之间,玩家之间.玩家与怪物之间,都有可能须要不能碰撞.怎样实现?这个问题困恼了一段时间,昨天在网上看到解答的方法: 这里举例玩家和怪物之间: 1,填加2个不同的层级mon ...

  2. Unity手游之路<七>角色控制器

    Unity手游之路<七>角色控制器 我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作, ...

  3. Unity手游之路&lt;七&gt;角色控制器

    我们要控制角色的移动,能够所有细节都由自己来实现.控制角色模型的移动,同一时候移动摄影机,改变视角.当然Unity也提供了一些组件,能够让我们做更少的工作,实现我们所期望的功能.今天我们就一起系统来学 ...

  4. 【Unity】11.1 角色控制器 (Character Controller)

    分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 角色控制器(Character Controller)主要用于对第三人称或第一人称游戏主角的控制.如果要创建类人角色,可 ...

  5. 【Unity】4.4 添加角色控制器

    分类:Unity.C#.VS2015 创建日期:2016-04-10 一.简介 设计完毕基本的场景后,一般都需要先运行看看效果如何,即先让场景"动起来",以方便观察不同的位置,而不 ...

  6. unity3d角色控制器01

    参考出处貌似是雨松大神.如有侵权,立即删除. 需要导入包 ①将FirstPerson Controller拖拽入Hierarchy(层次视图)中.由于角色控制器是具有一定物理引擎的,所以一定要将它放在 ...

  7. Unity3D笔记 英保通六 角色控制器

    一.角色控制器 U3D有两种角色控制方式:Rigidbody刚体.角色控制器组件(胶囊体组件) 面试的题目中经常会遇到这个问题: CharacterController和Rigidbody的区别? 这 ...

  8. 【Unity 3D】学习笔记三十八:角色控制器

    角色控制器 在unity中,已经帮我们实现的上下左右跳等动作,并将他们封装成了角色控制器.角色控制器保存在unity标准资源包中,能够说是很的强大.能够模拟第一或者第三人称视角.不受刚体的限制,很适用 ...

  9. U3D组件------CharacterController(角色控制器)

    角色控制器中有碰撞体和刚体的属性 Slope Limit:角色能爬的斜坡的坡度限制 Step Offset:角色走台阶的高度 Skin Width:当场景里面出现多个角色控制器的时候,两个对象在接触的 ...

随机推荐

  1. MVC路由规则以及前后台获取Action、Controller、ID名方法

    1.前后台获取Action.Controller.ID名方法 前台页面:ViewContext.RouteData.Values["Action"].ToString(); Vie ...

  2. OpenCV——改变图像大小

    , , int interpolation=INTER_LINEAR ) dsize与fx和fy必须不能同时为零,也就是说要么dsize不为零而fx与fy同时可以为0,要么dsize为0而fx与fy不 ...

  3. AD DIV 层的知识 和 行为特效

    1.AP(绝对定位) 2.使用AP DIV层和表格结合起来完美布局网页 3.层的Z轴值越大,该层就位于比较顶的位置 4.层有可见性的属性,层溢出,层的裁剪, 5层嵌套,先把光标定位在外层里面,然后拖多 ...

  4. mysql在linux的安装

  5. USB 调试工具(python2.7 + Tkinter + pyusb/pywinusb)

    项目地址:USB-HID-TEST 整体预览图(win8下的效果): ====================== 项目结构: COM --hidHelper.py --usbHelper.py UI ...

  6. 自制单片机之十一……模数转换IC ADC0809

    我们重在实际制做,太罗嗦的内容我就不说了,只讲些跟制做有关的最精炼的知识. ADC0809是可以将我们要测量的模拟电压信号量转换为数字量从而可以进行存储或显示的一种转换IC.下面是它的管脚图和逻辑图: ...

  7. 必须用C模拟OS?

    ASM基本必要,至于高级语言就很难说了.去osdev wiki上一翻一堆各种语言实现的玩意. 一个模拟OS其实不太容易完整搭出来,反倒是直接构造内核的后顾之忧少(如果还有真的想在SIGALRM里耍什么 ...

  8. Linux企业级项目实践之网络爬虫(20)——扩展成为规则插件模式

    为了方便我们爬虫功能的扩展,最好使用插件机制.使用插件技术能够在分析.设计.开发.项目计划.协作生产和产品扩展等很多方面带来好处:(1)结构清晰.易于理解.由于借鉴了硬件总线的结构,而且各个插件之间是 ...

  9. 用copy只能复制文件,用xcopy却说参数错误?

    dos里面没有复制文件夹这一个命令,这是个复合的命令,是由新建文件夹和将原文件夹里的东西全部复制进去两步组成的.就像剪贴一样,是先建立文件,然后再删除源文件.这是一种复合型的操作. 复制文件夹: 1. ...

  10. requireJS define require

    原文地址:http://blog.csdn.net/xiaogou56a/article/details/21340213 define 用来定义模块 require 用来加载模块 1 因为定义一个模 ...