Unity控制角色移动错误问题集合、第一人称视角

来源:互联网 发布:淘宝怎么才能做起来 编辑:程序博客网 时间:2024/06/10 23:22

使用了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;    }}


原创粉丝点击