首先要导入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. 单源最短路径 hdu 2066

    #include<string.h> //和prim类似#include<stdio.h> //prim所考虑的是节点与当前所建成的树的距离最小using namespace ...

  2. QQ在线客服

    css代码: .float0831 { POSITION: fixed; TOP: 180px; RIGHT: 1px; _position: absolute } .float0831 A { CO ...

  3. DEDE首页调用{dede:field.content/}

    过滤DEDE后台自己添加的Class文件和HTML代码: {dede:sql sql='Select content from #@__arctype where id=1'} [field:cont ...

  4. C 语言 输入字符串 并计算输入的字符的长度

    int main(void) { char a[50];int i=0;char *j;gets(a);//输入字符串j=a;while(*j!='\0'){j++;//指针指向下一个数组字符i++; ...

  5. spi ssp

    SSP(Synchronous Serial Port 同步串行口)某些微处理器所含有的一个通信模块(或支持的通信模式),用来和外围串行部件或其他微处理器进行通信,这些外围部件可以是串行E2PROM. ...

  6. JAVA_build_ant_Tstamp

    Description Sets the DSTAMP, TSTAMP, and TODAY properties in the current project. By default, the DS ...

  7. 一个关于poi导出的API

    先准备需要的参数 参数1:String title=“用户信息” 参数2:String[] headers String[] headers = { "用户名", "昵称 ...

  8. coredump查原因

    1. dmesg |tail -n 1 2. objdump -DCI ./a.out 示例: $ cat a.cpp #include <stdio.h> int main(){ int ...

  9. Manacher马拉车

    俗话说:摩托再好,不如骡拉啊(好像不是骡) Manacher就是O(N)计算最长回文子串的算法. 其中我们需要在0位置加入字符“$",然后原字符串中每两个字符加入一个"#" ...

  10. windows下重命名一个带有前缀"."dot字符的名字的错误问题

    如果用正常的右键重命名那么肯定会报错的,比如: 有一个名为project的文件,我想把它命名为.project,加了个前缀dot.然后window就报错了,弹出个对话框让“你必须输入一个文件名”.它可 ...