unity——使用角色控制器组件+射线移动
首先要导入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——使用角色控制器组件+射线移动的更多相关文章
- [unity3d]角色控制器组件相互间不碰撞
RPG游戏会有这种需求. 队友之间,玩家之间.玩家与怪物之间,都有可能须要不能碰撞.怎样实现?这个问题困恼了一段时间,昨天在网上看到解答的方法: 这里举例玩家和怪物之间: 1,填加2个不同的层级mon ...
- Unity手游之路<七>角色控制器
Unity手游之路<七>角色控制器 我们要控制角色的移动,可以全部细节都由自己来实现.控制角色模型的移动,同时移动摄影机,改变视角.当然Unity也提供了一些组件,可以让我们做更少的工作, ...
- Unity手游之路<七>角色控制器
我们要控制角色的移动,能够所有细节都由自己来实现.控制角色模型的移动,同一时候移动摄影机,改变视角.当然Unity也提供了一些组件,能够让我们做更少的工作,实现我们所期望的功能.今天我们就一起系统来学 ...
- 【Unity】11.1 角色控制器 (Character Controller)
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 角色控制器(Character Controller)主要用于对第三人称或第一人称游戏主角的控制.如果要创建类人角色,可 ...
- 【Unity】4.4 添加角色控制器
分类:Unity.C#.VS2015 创建日期:2016-04-10 一.简介 设计完毕基本的场景后,一般都需要先运行看看效果如何,即先让场景"动起来",以方便观察不同的位置,而不 ...
- unity3d角色控制器01
参考出处貌似是雨松大神.如有侵权,立即删除. 需要导入包 ①将FirstPerson Controller拖拽入Hierarchy(层次视图)中.由于角色控制器是具有一定物理引擎的,所以一定要将它放在 ...
- Unity3D笔记 英保通六 角色控制器
一.角色控制器 U3D有两种角色控制方式:Rigidbody刚体.角色控制器组件(胶囊体组件) 面试的题目中经常会遇到这个问题: CharacterController和Rigidbody的区别? 这 ...
- 【Unity 3D】学习笔记三十八:角色控制器
角色控制器 在unity中,已经帮我们实现的上下左右跳等动作,并将他们封装成了角色控制器.角色控制器保存在unity标准资源包中,能够说是很的强大.能够模拟第一或者第三人称视角.不受刚体的限制,很适用 ...
- U3D组件------CharacterController(角色控制器)
角色控制器中有碰撞体和刚体的属性 Slope Limit:角色能爬的斜坡的坡度限制 Step Offset:角色走台阶的高度 Skin Width:当场景里面出现多个角色控制器的时候,两个对象在接触的 ...
随机推荐
- 验证码 Demo
//设置响应头 response.setCharacterEncoding("image/jpeg"); int width=160; int height=40; Buffere ...
- do/while(0) c4127
原文链接:http://cnicholson.net/2009/03/stupid-c-tricks-dowhile0-and-c4127/ // NOISY CODE #define MULTI_L ...
- Python新手学习基础之运算符——成员运算与身份运算
成员运算符 Python里有成员运算符,可以判断一个元素是否在某一个序列中.比如可以判断一个字符是否属于这个字符串,可以判断某个对象是否在这个列表中等等. Python中的成员操作符的使用语法是: o ...
- CentOS7配置Nodejs环境安装记录
今天购买了阿里云服务器,系统选的是CentOS7,下面记录下在它上面安装Nodejs环境的过程,本次操作是直接连接的阿里云服务器的管理终端. 1.由于是纯净的环境,先通过以下命令安装nodejs编译及 ...
- [SQL注入1]From SQL injection to Shell
第一次写,希望大神们多指点. 对于刚接触WEB渗透测试这块的朋友们,很希望能有个平台可以练习.网络上有不少,十大渗透测试演练系统,我这里推荐一个在10以外,适合初学者一步一步进步的平台PENTESTE ...
- RFID电子标签加工的倒装工艺
倒装对于半导体封装领域的人员而言,是再熟悉不过的了.一般我们看到的集成电路多数以塑封为主,半导体芯片和外界进行信息沟通的通道,靠的就是集成电路的管脚.如果把集成电路外面的封装去掉,会发现每个集成电路内 ...
- 为什么memset的第二个参数不把int替换成char
memset是一个经常被用来初始化数组的函数,其定义如下: 1 void * memset ( void * ptr, int value, size_t num ); 它的效果大致是把以ptr为起始 ...
- glibc的了解,对内核的封装
glibc除了提供最底层的C运行库,还封装了kernel提供的API,程序通过glibc进行系统调用( syscall). 应用层面的C库,比如OpenSSL库: /usr/include/opens ...
- Joomla 3.x. How to edit registration page
Adding registration form fields In order to add new fields to the registration form, database and fi ...
- poj 2229 Ultra-QuickSort(树状数组求逆序数)
题目链接:http://poj.org/problem?id=2299 题目大意:给定n个数,要求这些数构成的逆序对的个数. 可以采用归并排序,也可以使用树状数组 可以把数一个个插入到树状数组中, 每 ...