角色控制器(CharacterController)

移动:

  1、SimpleMove(Vector3: vector3&speed)

    简单移动,可以根据vector3方向移动,物体不需要添加刚体即受重力影响,不需要添加碰撞器即可以产生碰撞,但无法推动其它物体。

  2、Move(Vector3: vector3&speed)

    移动,根据vector3方向移动,速度比SimpleMove快许多,不受重力影响,但可以在不添加碰撞器的情况下产生碰撞,无法推动其它物体。

sample

using UnityEngine;
using System.Collections;

public class CharControl : MonoBehaviour {

    CharacterController charCtl ;
    // Use this for initialization
    void Start () {
        charCtl = GetComponent<CharacterController>() ;
    }
    
    // Update is called once per frame
    void Update () {
        charCtl.Move(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"))* 0.5f) ;
//        charCtl.SimpleMove(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"))* 10) ;
    }
}
View Code

碰撞:

  固定代码,需要添加刚体,也可以不添加刚体,改变函数中判断

    public float pushPower = 2.0F;
    void OnControllerColliderHit(ControllerColliderHit hit) {
        Rigidbody body = hit.collider.attachedRigidbody;//没有刚体返回空
        if (body == null || body.isKinematic)
            return;

        if (hit.moveDirection.y < -0.3F)//被碰撞物体在它下面
            return;

        Vector3 pushDir = new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);
        body.velocity = pushDir * pushPower;
    }
View Code

使一人物围绕三个点自动巡逻  转弯时为平滑转弯

两种方法:

  1、 改变transform.forward

  2、 改变transform.rotation

using UnityEngine;
using System.Collections;

public class CharControl : MonoBehaviour {

    CharacterController charCtl ;
    public Transform[] point ;
    public Transform nextPoint ;
    Transform t1 ;
    public int index ;
    // Use this for initialization
    void Start () {
        charCtl = GetComponent<CharacterController>() ;
        index = 0 ;
        nextPoint = point[0] ;
    }
    
    // Update is called once per frame
    
    void Update () {
        
        
//        charCtl.Move(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"))* 0.5f) ;
//        charCtl.SimpleMove(new Vector3(0, 0, Input.GetAxis("Vertical"))* 10) ;
        
//        changeForward() ;
          changeRotation() ;        
    }
    void changeForward(){
        if(Vector3.Distance(IgnoreY(transform.position), IgnoreY(nextPoint.position))>0.2f){
            Vector3 direction = (IgnoreY(nextPoint.position)-IgnoreY(transform.position)).normalized ;//must be normalized
            transform.forward = Vector3.Lerp(transform.forward, direction, 0.1f);
//            charCtl.transform.forward = direction;
//            charCtl.transform.LookAt(nextPoint.position);
            charCtl.SimpleMove(transform.forward*10) ;
        }else{
            index = (index+1)%point.Length ;
            nextPoint = point[index] ;
        }
    }
    void changeRotation(){
        if(Vector3.Distance(IgnoreY(transform.position), IgnoreY(nextPoint.position))>0.2f){
            Vector3 direction = (IgnoreY(nextPoint.position)-IgnoreY(transform.position)).normalized ;
            Quaternion rotation = Quaternion.LookRotation(direction);
            transform.rotation = Quaternion.Lerp(transform.rotation, rotation, 0.1f);
            charCtl.SimpleMove(transform.forward*10) ;

        }else{
            index = (index+1)%point.Length ;
            nextPoint = point[index] ;
            
        }
    }
    
    
    Vector3 IgnoreY(Vector3 x){
        return new Vector3(x.x, 0, x.z) ;
    }
    public float pushPower = 2.0F;
    void OnControllerColliderHit(ControllerColliderHit hit) {
        Rigidbody body = hit.collider.attachedRigidbody;//no rigidbody return null
        if (body == null || body.isKinematic)
            return;

        if (hit.moveDirection.y < -0.3F)
            return;

        Vector3 pushDir = new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);
        body.velocity = pushDir * pushPower;
    }

}
原文地址:https://www.cnblogs.com/xiaolongchase/p/3271998.html