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

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

    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值