使用了CharacterContoller造成人物穿透地面无限下坠
解决办法:
1.先添加CharacterContoller控件,这个组件提供了移动功能和碰撞交互,在行走的时候不会穿到墙里面。
2..再给主角对象添加刚体组件(rigidbody)组件,在刚体组件属性设置出,取消Use Gravity选项,并且勾选IsKinematic,使其不受物理影响
第一人称视角控制代码
Unity3D自带了两个角色移动组件第三人称和第一人称,满足基本的学习需求了,下面的代码比官方自带的简单,我是在学习的时候为了理解这些逻辑参考书本写的。
using UnityEngine;
using System.Collections;
public class Hero : MonoBehaviour {
//主角自身属性
public float h_moveSpeed = 3.0f;// 移动速度
public float h_gravity = 2.0f;//重力值
public float h_hp = 10.0f;//主角生命值
CharacterController h_cc;//角色控制器组件
private Transform self_transform;
//绑定摄像机
Transform cam_transform;//摄像机transform
Vector3 cam_rot;//摄像机旋转角度
float cam_height = 5.0f;//既是赋值给摄像机的Y轴
float cam_forward = 5.0f;//既是赋值给摄像机的Z轴
void Start () {
self_transform = this.transform;
h_cc=this.GetComponent<CharacterController>();
CamStart();
}
//初始化摄像机位置,与主角关联
void CamStart()
{
cam_transform = Camera.mainCamera.transform;
//因为需要将主角绑定到摄像机,需要将主角的坐标与摄像机关联
Vector3 h_post = self_transform.position;//读取当前主角的坐标
h_post.y += cam_height;//因为摄像机要放在主角的头部,也就是眼睛位置,所以Y坐标要增加一点
cam_transform.position = h_post;//主角坐标与摄像机关联
cam_rot = cam_transform.eulerAngles;
Screen.lockCursor = true;
}
void Update () {
if (h_hp <= 0)
return;
Control();
}
void OnGUI()
{
string a = "";
string b = "";
a = "AxisMouse X :" + Input.GetAxis("Mouse X").ToString();
b = "AxisMouse Y :" + Input.GetAxis("Mouse Y").ToString();
GUILayout.Label(a);
GUILayout.Label(b);
}
void Move()
{
float xm=0, ym=0, zm=0;
ym -= h_gravity * Time.deltaTime;
if (Input.GetKey(KeyCode.W))
{
zm += h_moveSpeed * Time.deltaTime;
}
if (Input.GetKey(KeyCode.S))
{
zm -= h_moveSpeed * Time.deltaTime;
}
if (Input.GetKey(KeyCode.A))
{
xm -= h_moveSpeed * Time.deltaTime;
}
if (Input.GetKey(KeyCode.D))
{
xm += h_moveSpeed * Time.deltaTime;
}
h_cc.Move(self_transform.TransformDirection(new Vector3(xm, ym, zm)));
}
void Control()
{
float rh = Input.GetAxis("Mouse X");
float rv = Input.GetAxis("Mouse Y");
//捕获鼠标转动值,赋值给摄像机的eulerAngles,实现转动
cam_rot.x -= rv;
cam_rot.y += rh;
cam_transform.eulerAngles = cam_rot;
//转动鼠标,视角变化后,保持主角的面向方向与摄像机方向一致
Vector3 camTempRot = cam_transform.eulerAngles;
camTempRot.x = 0;
camTempRot.z = 0;
self_transform.eulerAngles = camTempRot;
Move();
//执行移动以后,摄像机位置与主角位置保持一致
Vector3 tempHeroPost = self_transform.position;
tempHeroPost.y = cam_height;
cam_transform.position = tempHeroPost;
}
}