unity镜头旋转与角色转向(一)
  gBNXT4vbpRIG 2023年11月02日 60 0

在游戏中总会遇到人物角色通过键盘WASD这几个键进行转动方向的功能以及通过鼠标进行镜头旋转观察角色的功能。

需求一:角色人物需要进行转动方向。

需求二:通过鼠标进行镜头旋转观察角色。

本章节先讲“角色人物需要进行转动方向”的功能实现。

第一步先进行场景建立:

在unity中新建一个scene,为了模拟角色我们在场景中新建一个物体Capsule (1),然后在其下放入三个子物体:一个是角色模型,一个是主相机,另一个是一个相机要看到的物体。如下图:本案例中的角色模型是一只恐龙velociraptor。

unity镜头旋转与角色转向(一)_角色模型


unity镜头旋转与角色转向(一)_unity_02

第二步:在Capsule (1)这个父物体上添加一个脚本playertest。脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playertest : MonoBehaviour
{
    
    public GameObject model;
    public Transform Thirdcamera;    
    public float rotSpeed;
    public GameObject headpoint;
    private float mouse_y;
    private Quaternion mouse_newrotation;
    private float mouse_x;
    public float followdistance=5;

    private CharacterController controller;
    public float walkspeed=1f;
    private float smoothtime;

    // Start is called before the first frame update
    void Start()
    {
        controller = this.GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
      
        //#region//移动
        //if (Input.GetKey(KeyCode.A))
        //{
        //   // if (controller.isGrounded)
        //    controller.SimpleMove(-Thirdcamera.transform.right * walkspeed);
        //}

        //if (Input.GetKey(KeyCode.D))
        //{
        //   // if (controller.isGrounded)
        //        controller.SimpleMove(Thirdcamera.transform.right * walkspeed);
        //}

        //if (Input.GetKey(KeyCode.W))
        //{
        //    //if (controller.isGrounded)
        //        controller.SimpleMove(Thirdcamera.transform.forward * walkspeed);
        //}

        //if (Input.GetKey(KeyCode.S))
        //{
        //   // if (controller.isGrounded)
        //        controller.SimpleMove(-Thirdcamera.transform.forward * walkspeed);
        //}
        //#endregion

        #region//人物旋转
        if (Input.GetKeyDown(KeyCode.A))
        {
          

            Vector3 turndegreen = Thirdcamera.transform.localEulerAngles;

            Vector3 newturndegreen = new Vector3(0, turndegreen.y - 90, 0);

            Quaternion getnewturndegreen = Quaternion.Euler(newturndegreen);


            model.transform.localRotation = getnewturndegreen;
            //  model.transform.forward = new Vector3(model.transform.localRotation.x, model.transform.localRotation.y, zz);
        }

        if (Input.GetKeyDown(KeyCode.W))
        {
            model.transform.forward = new Vector3(Thirdcamera.transform.forward.x, 0, Thirdcamera.transform.forward.z);
        }

        if (Input.GetKeyDown(KeyCode.D))
        {

            Vector3 turndegreen = Thirdcamera.transform.localEulerAngles;

            Vector3 newturndegreen = new Vector3(0, turndegreen.y + 90, 0);

            Quaternion getnewturndegreen = Quaternion.Euler(newturndegreen);


            model.transform.localRotation = getnewturndegreen;
        }

        if (Input.GetKeyDown(KeyCode.S))
        {
            Vector3 turndegreen = Thirdcamera.transform.localEulerAngles;

            Vector3 newturndegreen = new Vector3(0, turndegreen.y - 180, 0);

            Quaternion getnewturndegreen = Quaternion.Euler(newturndegreen);

            model.transform.localRotation = getnewturndegreen;
        }
        #endregion

        #region//相机旋转
        if (Input.GetMouseButton(1))
        {
          

            mouse_y += Input.GetAxis("Mouse X") * 1f * rotSpeed;
            mouse_x -= Input.GetAxis("Mouse Y") * 1f * rotSpeed;
            mouse_x = Mathf.Clamp(mouse_x, -89, 89);
            mouse_x = ClampAngle(mouse_x);
            mouse_y = ClampAngle(mouse_y);

            mouse_newrotation = Quaternion.Euler(mouse_x, mouse_y, 0);

            Thirdcamera.rotation = mouse_newrotation;//相机角度等于鼠标最终 角度

            Vector3 direction = mouse_newrotation * Vector3.forward;

            Thirdcamera.position = headpoint.transform.position - direction * followdistance;

            Thirdcamera.LookAt(headpoint.transform);

#endregion
           
        }
    }

    static float ClampAngle(float angle)
    {
        if (angle < -180)
            angle += 360;
        if (angle > 180)
            angle -= 360;
        return angle;
    }
}

第三步:将场景中的三个物体分别拖入对应的属性里。如下图:

unity镜头旋转与角色转向(一)_Quaternion_03

第四步:运行unity就可以看到效果。操作方式是ASWD可以进行角色转向,鼠标右键点击拖动可以进行镜头转向。

unity镜头旋转与角色转向(一)_Quaternion_04

下面对上面代码的思路进行分析一下:

通过代码的命名就可以得知每个成员的定义,重点是看脚本中的方法。

因为本次不讲角色移动,所以代码中的移动代码已经注释掉了。

人物旋转的方法,首先从以下代码进行看,这个代码是将相机的前方赋值给角色人物模型的前方。也就是说只要按下W键则角色人物的朝向一定是会和相机的朝向一致的。如下:

 

if (Input.GetKeyDown(KeyCode.W))

        {

            model.transform.forward = new Vector3(Thirdcamera.transform.forward.x, 0, Thirdcamera.transform.forward.z);

        }

剩下的三个方向的朝向是类似的,只拿其中一个来讲解。如下:


if (Input.GetKeyDown(KeyCode.A))
        {
          

            Vector3 turndegreen = Thirdcamera.transform.localEulerAngles;

            Vector3 newturndegreen = new Vector3(0, turndegreen.y - 90, 0);

            Quaternion getnewturndegreen = Quaternion.Euler(newturndegreen);


            model.transform.localRotation = getnewturndegreen;
            //  model.transform.forward = new Vector3(model.transform.localRotation.x, model.transform.localRotation.y, zz);
        }

当按下A键时,相机的角度中的Y轴要旋转90度。

因为unity里的rotation是四元素方式,所以我们使用Thirdcamera.transform.localEulerAngles;方法将角度转化成三维坐标的方式。

然后经过Vector3的方法将角度增加或减去90度后再次将Vector3转化成四元素的Quaternion的方法。也就是下面这句代码:

Quaternion getnewturndegreen = Quaternion.Euler(newturndegreen);

之后再将他赋值给角色模型的角度。这样模型的角度就会在相机的角度的基础上进行旋转了。

--------------以上是人物旋转的方法-------------下一篇博客文会讲相机旋转的方法————————————————


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

gBNXT4vbpRIG