• 角色控制器(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;
        }
    
    }
  • 相关阅读:
    OpenSeadragon 基础显示图片 学习记录 (一)
    数组篇【第一集】
    css如何让页面上的文字不能选中??
    toggleClass()原来是这么用的
    vue-gemini-scrollbar(vue组件-自定义滚动条)
    css绝对底部的实现方法
    Select下拉框需求
    iview之Model对话框封装
    Java基础(一)
    vue-draggable-resizable插件的API记录
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/3271998.html
Copyright © 2020-2023  润新知