控制角色移动,加上刚体和碰撞盒后经常出现角色被其他物体撞飞或者角色走动过程中经常摔倒等难以控制的现象。
利用角色控制器可以避免角色被撞飞翻到等。
方法如下
首先在Hierasrchy视图中选择需要添加角色控制器的游戏对象,具体操作方法是在Unity导航菜单栏中选择“Component”->“Physics”->“Character Controller”菜单项即可给对象添加角色控制器。
添加完角色控制器组件后,就需要在脚本中控制角色控制器组件,首先创建一个游戏脚本,然后在脚本中使用方法GetComponent<CharacterController>()获取角色控制器组件对象,接着通过调用SimpleMove()方法(其参数为角色移动的方向)来移动该角色。
private Transform myTransform;
public CharacterController controller; //定义角色控制器
private float moveSpeed = 30.0f; //定义移动速度
public GameObject colliderObj;
void Start ()
{
myTransform = transform;
//获取角色控制器组件
controller = gameObject.GetComponent<CharacterController>();
}
void Update ()
{
if (Input.GetKeyDown(KeyCode.A))
{
myTransform.Rotate(0.0f, - 10.0f,0.0f); //以y轴为中心旋转
}
if (Input.GetKeyDown(KeyCode.D))
{
myTransform .Rotate(0.0f,10.0f,0.0f); //以Y轴为中心旋转
}
if (Input.GetKeyDown(KeyCode.W))
{
controller.SimpleMove(Vector3.forward * moveSpeed); //参数为 移动方向乘以移动速度
}
if (Input.GetKeyDown(KeyCode.S))
{
controller.SimpleMove(Vector3.forward * (-moveSpeed));
}
if (controller.collisionFlags == CollisionFlags.Sides)
{
if (colliderObj != null)
{
//碰撞的游戏对象名字
print("colliderObj.name = "+colliderObj.name);
}
}
}
// 移动角色时调用此方法CharacterController.Move()移动,下方方法才会被调用,Move()方法Y轴上速度被忽略,速度以米/秒为单位,重力被自动应用,建议你没帧只调用一次Move或者SimpleMove方法
void OnControllerColliderHit(ControllerColliderHit hit)
{
//该方法检测与角色控制器碰撞的对象
colliderObj = hit.gameObject;//得到碰撞的游戏对象
}
只有调用CharacterController.Move调用期间,才会触发碰撞方法
//角色控制器组件在与具有Collider组件对象之间的碰撞
void OnControllerColliderHit(ControllerColliderHit hit)
{
//判断碰撞的对象是否具备刚体组件
GameObject hitObject = hit.collider.gameObject;
Rigidbody rigidbody = hitObject.rigidbody;
if(rigidbody != null && !rigidbody.isKinematic)
{
//地面也具备刚体组件,这里判断一下
if(!hitObject.name.Equals("Terrain") )
{
//给被碰撞的刚体添加一个冲击力
rigidbody.AddForce(new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z) * 10);
}
}
}
在CharacterController.Move()调用期间,胶囊体的哪个部分与周围环境相碰撞。
controller.isGrounded是否接触地面
CharacterController controller = GetComponent(CharacterController);
if ((controller.collisionFlags & CollisionFlags.Above) != 0) 碰撞体在自身的上方