Unity3d中CharacterController的移动和碰撞分析

在Unity3d中系统提供的第一人称视角模型First Person Controller的移动可分为两种:

一.移动transform

这种移动方式为直接对该人物模型的transform属性做位移操作,移动方式为在Update函数中的写法:

void Update () {
     if(Input.GetKey(KeyCode.W))
     {
        transform.Translate(Vector3.forward * Time.deltaTime * speed);
     }
     else if(Input.GetKey(KeyCode.S))
     {
        transform.Translate(Vector3.forward * Time.deltaTime * -speed);
     }
     else if(Input.GetKey(KeyCode.A))
     {
        transform.Translate(Vector3.right * Time.deltaTime * -speed);
     }
     else if(Input .GetKey(KeyCode.D))
     {
       transform.Translate(Vector3.right * Time.deltaTime * speed);
     }
}

人物模型的碰撞检测:

1.这种方法不会触发静态碰撞,即在静态碰撞器的物体中可以穿进,穿出。

2.在碰撞带有刚体组件的物体时能够发生刚体碰撞,若要检测刚体碰撞,必须将检测脚本附加在带刚体组件的物体上。

3.人物模型可以进行触发器检测。

二:利用系统提供的人物模型类CharacterController对象中的Move方法进行移动,具体代码如下:

CharacterController controller;

controller.Move(Vector3.forward * Time.deltaTime * speed);

人物模型的碰撞检测:

1.这种移动方法的人物模型在静态碰撞器中可以发生静态碰撞,即不能够穿越物体,碰到有静态碰撞器的物体只能停下来。

2.在碰撞带刚体的物体时,不会穿越该物体,也不会触发任何的刚体碰撞检测函数,但是可以用另外一个函数用来检测人物模型接触到刚体物体。

检测函数举例:

void OnControllerColliderHit(ControllerColliderHit hit)
{
    Rigidbody body = hit.collider.attachedRigidbody;
    if(body == null || body.isKinematic)
    {
        return;
    }
    else
    {
        Debug.Log("touch gameObject: " + hit.collider.gameObject.name);

        //摧毁物体
        //Destroy(hit.collider.gameObject);

        //给物体一个移动的力
       //body.velocity = new Vector3(hit.moveDirection.x,0,hit.moveDirection.z) * 30.0f;
    }
}        

3.这种移动方法也能执行触发器检测函数。

时间: 2024-08-02 17:34:25

Unity3d中CharacterController的移动和碰撞分析的相关文章

Unity3D中常用的数据结构总结与分析

Unity3D中常用的数据结构总结与分析 c#语言规范 阅读目录 1.几种常见的数据结构 2.几种常见数据结构的使用情景 来到周末,小匹夫终于有精力和时间来更新下博客了.前段时间小匹夫读过一份代码,对其中各种数据结构灵活的使用赞不绝口,同时也大大激发了小匹夫对各种数据结构进行梳理和总结的欲望.正好最近也拜读了若干大神的文章,觉得总结下常用的数据结构以供自己也能灵活的使用变得刻不容缓.那么还是从小匹夫的工作内容入手,就谈谈在平时使用U3D时经常用到的数据结构和各种数据结构的应用场景吧. 回到目录

(转)Unity3D中常用的数据结构总结与分析

http://www.cnblogs.com/murongxiaopifu/p/4161648.html#array 1.几种常见的数据结构 常碰到的几种数据结构:Array,ArrayList,List<T>,LinkedList<T>,Queue<T>,Stack<T>,Dictionary<K,T> 数组Array: 数组是最简单的数据结构.其具有如下特点: 数组存储在连续的内存上. 数组的内容都是相同类型. 数组可以直接通过下标访问. 数

unity3d中的trigger和collision消息以及刚体与碰撞体

一直困惑于unity3d中的触发和碰撞消息在什么条件下能够发生,平时用时也是一知半解.磨刀不误砍柴工,是时候发点时间一劳永逸的解决这个问题了XD. OnTriggerEnter, OnTriggerStay, OnTriggerExit 是为触发类消息,记为trigger OnCollisionEnter, OnCollisionStay, OnCollisionExit是为碰撞类消息, 记为collision None表示两类消息都没发生 如果对象有刚体(rigidbody)且其 IsKine

【吐血推荐】简要分析unity3d中剪不断理还乱的yield

在学习unity3d的时候很容易看到下面这个例子: 1 void Start () { 2 StartCoroutine(Destroy()); 3 } 4 5 IEnumerator Destroy(){ 6 yield return WaitForSeconds(3.0f); 7 Destroy(gameObject); 8 } 这个函数干的事情很简单:调用StartCoroutine函数开启协程,yield等待一段时间后,销毁这个对象:由于是协程在等待,所以不影响主线程操作.一般来说,看到

【转】简要分析unity3d中剪不断理还乱的yield

在学习unity3d的时候很容易看到下面这个例子: 1 void Start () { 2 StartCoroutine(Destroy()); 3 } 4 5 IEnumerator Destroy(){ 6 yield return WaitForSeconds(3.0f); 7 Destroy(gameObject); 8 } 这个函数干的事情很简单:调用StartCoroutine函数开启协程,yield等待一段时间后,销毁这个对象:由于是协程在等待,所以不影响主线程操作.一般来说,看到

简要分析unity3d中剪不断理还乱的yield

在学习unity3d的时候非常easy看到以下这个样例: 1 void Start () { 2 StartCoroutine(Destroy()); 3 } 4 5 IEnumerator Destroy(){ 6 yield return WaitForSeconds(3.0f); 7 Destroy(gameObject); 8 } 这个函数干的事情非常easy:调用StartCoroutine函数开启协程.yield等待一段时间后,销毁这个对象:因为是协程在等待.所以不影响主线程操作.

(转)Unity3D中移动物体位置的几种方法

1. 简介 在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale). 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position). 2.1 Transform.Tra

Unity3D中的第三人称镜头的脚本控制

原地址:http://blog.csdn.net/mobanchengshuang/article/details/27591271 好久没有敲Blog了,谢谢大家的留言.关注.私信等支持,但是我好像已经没有办法让自己继续写以前的博客系列了,因为我发现网上关于unity3D的内容太少了,所以我无法自拔地想写U3D相关的文章!!! 第三人称视角 第三人称视角是什么?很简单,CS就是一种第一人称视角游戏,玩家没有办法看到自己的角色形象,只能观察除开自己之外的游戏内容.第三人称视角那么就明显是能够看到

(转)Unity3d中的碰撞检测

很多时候,当我们的主角与其他GameObject发生碰撞时, 我们需要做一些特殊的事情,比如:子弹击中敌人,敌人就得执行一系列的动作.这时,我们就需要检测到碰撞现象,即碰撞检测.这一篇,我来具体谈谈自己所了解的碰撞检测,希望高手不佞赐教. 首先,我们得明确一点:即产生碰撞信息所需要的条件.事实上,在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器.这两种方式的应用非常广泛.为了完整的了解这两种方式,我们必须理解以下概念:    (一)碰撞器是一群组件,它包含了