Unity3D基础38:角色控制器组件

 

前文:https://blog.csdn.net/Jaihk662/article/details/87906156(Input控制面板)

一、CharacterController角色控制器

为什么使用角色控制器而不使用刚体?

 → 刚体过于灵活(敏感),例如稍有碰撞就会被弹开,物体的质量不好把握或计算等等

角色控制器面板与属性:

  • Slope Limit:控制角色最大的爬坡斜率
  • Step Offset:控制角色可以迈上最大的台阶高度
  • Skin Width:在角色的外围包裹着一层“皮肤”,这层皮肤的厚度,就相当于角色身上透明的衣服,如果Skin Width设置为1米,那么角色当然就会“浮空”1米,一般保持默认即可
  • Min Move Distance:最小移动距离,默认是1毫米,如果该数值过大但代码中单位移动速度很慢,角色就不会动
  • Center/Radius/Height:角色控制器组件在Scene面板中体现为一个“胶囊碰撞器”的形状,如下面第二张图,Center为胶囊中心点位置,Radius为半径,Height为高度

 

二、角色碰撞器与实例

OnControllerColliderHit(ControllerColliderHit hit):角色控制器自带有碰撞器,hit为角色碰撞器碰撞到的物体的信息,除此之外,如果拥有角色控制器组件,那么共存的其他的碰撞器组件就会处于“无效”状态

角色碰撞器的所有属性也都可以通过脚本获取,另一个控制角色移动脚本示例如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
    private Rigidbody myRigidbody;
    private Transform myTran;
    private CharacterController cont;
    public float moveSpeed = 12.0f;
    public float turnSpeed = 180.0f;
    private float myMoveAxis = 0.0f;
    private float myTurnAxis = 0.0f;
    void Start()
    {
        myRigidbody = gameObject.GetComponent<Rigidbody>();
        myTran = gameObject.GetComponent<Transform>();
        cont = gameObject.GetComponent<CharacterController>();
        cont.skinWidth = 0.02f;     //初始化角色的皮肤厚度
    }
    void FixedUpdate()
    {
        myMoveAxis = Input.GetAxis("Vertical");
        myTurnAxis = Input.GetAxis("Horizontal");
        Move(myMoveAxis);
        Turn(myTurnAxis);
    }
    void Move(float myMoveAxis)
    {
        //Vector3 moveChange = myTran.forward * myMoveAxis * Time.deltaTime * moveSpeed;
        //myRigidbody.MovePosition(myTran.position + moveChange);
        if (myMoveAxis > 0)             //角色前进
            cont.Move(myTran.forward * Time.deltaTime * moveSpeed * myMoveAxis);
        else if (myMoveAxis < 0)        //角色后退
        {
            //Quaternion turnChange = Quaternion.Euler(0f, 90f, 0f);
            //myRigidbody.MoveRotation(myRigidbody.rotation * turnChange);
            cont.Move(myTran.forward * Time.deltaTime * moveSpeed * myMoveAxis/2);
        }
    }
    void Turn(float myTurnAxis)
    {
        float Change = myTurnAxis * turnSpeed * Time.deltaTime;
        Quaternion turnChange = Quaternion.Euler(0f, Change, 0f);
        myRigidbody.MoveRotation(myRigidbody.rotation * turnChange);
    }
    void OnControllerColliderHit(ControllerColliderHit hit)
    {
        Debug.Log(hit.gameObject.name);
    }
}

 

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值