Unity如何避免相机穿墙

发表于2019-01-24
评论0 1.27w浏览
当采用第一人称相机时相机穿墙是一件很烦人的事情,避免相机穿墙有几种方法,比较常见的是采用characterController的第一人称角色控制器,但是这个比较麻烦的事情是它有3个子物体,还要有好几个的脚本,有时我们仅仅就是为了使相机具有刚体特性而不需要其他功能,显然使用第一人称角色控制器有点大材小用。所以这里我们可以换以一种方法,例如我们场景里的普通相机,我们如果想避免相机穿墙,可以给相机添加Character Controller组件即可。添加的方式为,选择你要添加组件的相机,点击inspector面板下方的add Component,选择physics->Character Controller,给相机添加完角色控制器后我们就可以通过代码控制相机在场景里漫游了。

具体的代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
using UnityEngine.EventSystems;
using UnityStandardAssets.ImageEffects;
public class shijiao : MonoBehaviour
{
    GameObject Cm;
    //方向灵敏度  
    public float sensitivityX = 10F;   
    public float sensitivityY = 10F;   
   //上下最大视角(Y视角)  
    public float minimumY = -60F;  
    public float maximumY = 60F;
    float rotationY = 0F;  
    private float movespeed = 20;
    CharacterController ctrlor;
    void Start ()
    {
      Cm = GameObject.Find("Mcam");
      ctrlor = GetComponent<CharacterController>();
    }
    void Update()
    {
        if (Input.GetMouseButton (1)) {
                //W键前进
                if (Input.GetKey (KeyCode.W)) {
                    Vector3 forward = transform.TransformDirection(Vector3.forward);
                    ctrlor.Move(forward*movespeed*Time.deltaTime);
                }
                //S键后退
                if (Input.GetKey(KeyCode.S))
                {
                    Vector3 back = transform.TransformDirection(Vector3.back);
                    ctrlor.Move(back * movespeed * Time.deltaTime);
                }
                //A键移动
                if (Input.GetKey(KeyCode.A))
                {
                    Vector3 left = transform.TransformDirection(Vector3.left);
                    ctrlor.Move(left* movespeed * Time.deltaTime);
                }
                //D键后退
                if (Input.GetKey(KeyCode.D) && gameObject.transform.position.y > 0)
                {
                    Vector3 right = transform.TransformDirection(Vector3.right);
                    ctrlor.Move(right * movespeed * Time.deltaTime);
                }
                //E键升高
                if (Input.GetKey (KeyCode.E)) {
                    Vector3 upward = transform.TransformDirection(Vector3.up);
                    ctrlor.Move(upward * movespeed * Time.deltaTime);
                }
                if (Input.GetMouseButton (0)){
                //根据鼠标移动的快慢(增量), 获得相机左右旋转的角度(处理X)  
                float rotationX = transform.localEulerAngles.y + Input.GetAxis ("Mouse X") * sensitivityX;  
                //根据鼠标移动的快慢(增量), 获得相机上下旋转的角度(处理Y)  
                rotationY += Input.GetAxis ("Mouse Y") * sensitivityY;  
                //角度限制. rotationY小于min,返回min. 大于max,返回max. 否则返回value   
                rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);  
                //总体设置一下相机角度  
                transform.localEulerAngles = new Vector3 (-rotationY, rotationX, 0);
                }
            }
}

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引