在Unity官网教程SurvivalShooter(恶魔射手)中,只处理了主角跟随鼠标旋转,摄像机视野并没有旋转或通过滚轮实现视野的拉远拉近,一下是我的实现方法。

  在教程中,主角的移动是通过
    //void Move(float h, float v)
    //{
    //    movement.Set(h, 0f, v);
    //    movement = movement.normalized * speed * Time.deltaTime;
    //    playerRgidBody.MovePosition(transform.position + movement);
    //    PlayAnimation(h, v);
    //    PlayerTurning(h, v);
    //}
实现的,他只能实现世界坐标系中x轴方向和z轴方向的移动(我的理解),以下是玩家的代码:
void FixedUpdate()
    {
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");
        //Move(h, v);
        if (Input.GetKey(KeyCode.W))
        {
            MoveForward();
        }
        if (Input.GetKey(KeyCode.S))
        {
            MoveBack();
        } if (Input.GetKey(KeyCode.A))
        {
            MoveLeft();
        }
        if (Input.GetKey(KeyCode.D))
        {
            MoveRight();
        }
        PlayAnimation(h, v);
        PlayerTurning(h, v);
    }
    void MoveForward()
    {
        transform.Translate(Vector3.forward * Time.deltaTime * speed);
    }
    void MoveBack()
    {
        transform.Translate(Vector3.forward * Time.deltaTime * -speed);
    }
    void MoveLeft()
    {
        transform.Translate(Vector3.left * Time.deltaTime * speed);
    }
    void MoveRight()
    {
        transform.Translate(Vector3.left * Time.deltaTime * -speed);
    }
    void PlayAnimation(float h, float v)
    {
        bool IsWalking = h != 0 || v != 0;
        anim.SetBool("IsWalking", IsWalking);
    }
    void PlayerTurning(float h, float v)//人物跟随鼠标旋转
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit, camRayLength, floorMask))
        {
            Vector3 playerToMouse = hit.point - transform.position;
            playerToMouse.y = 0f;
            Quaternion newRotation = Quaternion.LookRotation(playerToMouse);
            playerRgidBody.MoveRotation(newRotation);
        }
    }
以下是摄像机的代码:
    void Start()
    {
        offset = transform.position - target.position;
    }
    void Update()
    {
        Vector3 currentPosition = target.position + offset;
        transform.position = Vector3.Lerp(transform.position,
            currentPosition, smoothing * Time.deltaTime);
        RotateView();
        ScrooView();
    }
    void ScrooView()//处理视野的拉近和拉远效果
    {
        Distance = offset.magnitude;
        Distance += -Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
        Distance = Mathf.Clamp(Distance, 5, 23);
        offset = offset.normalized * Distance;
    }
    void RotateView()//处理视野的选转
    {
        if (Input.GetMouseButtonDown(1))
        {
            isRotating = true;
        }
        if (Input.GetMouseButtonUp(1))
        {
            isRotating = false;
        }
        if (isRotating)
        {
            Vector3 originalPosition = transform.position;
            Quaternion originalRotation = transform.rotation;
 
            transform.RotateAround(target.position, target.up, Input.GetAxis("Mouse X") * rotateSpeed);
            transform.RotateAround(target.position, transform.right, -Input.GetAxis("Mouse Y") * rotateSpeed);
 
            float x = transform.eulerAngles.x;
            if (x < 10 || x > 80)//防止前后旋转角度过大
            {
                transform.position = originalPosition;
                transform.rotation = originalRotation;
            }
            offset = transform.position - target.position;
        }
    }
通过此方法,即可实现旋转视野、摄像机跟随主角移动和旋转。
如有错误,欢饮指正。

Unity3D实现摄像机视野的拉远拉近和跟随主角旋转效果的更多相关文章

  1. 【Unity3D】使用鼠标键盘控制Camera视角(即时战略类游戏视角):缩近,拉远,旋转

    今天写一个demo,要用到鼠标键盘控制三维视角,因此写了个脚本用于控制. 该脚本可以用于即时战略类游戏的视角,提供了缩进,拉伸,旋转.同时按住鼠标右键不放,移动鼠标可以实现第一人称视角的效果. usi ...

  2. unity鼠标滚轮控制摄像机视野的缩放和按住鼠标控制摄像机移动

    //摄像机前进后退的速率 private float view_value=20f; private float maximum = 100; private float minmum = 30; / ...

  3. Unity 3d 实现物体跟随摄像机视野运动

    https://blog.csdn.net/qq_31411825/article/details/61623857 Unity 3d 实现物体跟随摄像机视野运动Created by miccall ...

  4. Unity3D 相机跟随主角移动

    这里给主相机绑定一个脚本. 脚本写为: using UnityEngine; using System.Collections; public class camerafollow : MonoBeh ...

  5. Unity3D 的摄像机

    什么是摄像机 Unity3D中,摄像机是一个非常非常重要的组件. 他的作用就是:将你设计的场景投影到设备的屏幕上. 摄像机的属性 1 clear flags 确定屏幕的哪一部分将被清除. 每个摄像机在 ...

  6. 获取Unity3D虚拟摄像机的图像

    最新博客地址已转到: http://blog.csdn.net/zzlyw?viewmode=contents   ------------------------------------------ ...

  7. [原]Unity3D深入浅出 - 摄像机组件(Camera)

    在Unity中创建一个Camera后,除了默认带一个Transform组件外,还会附带Flare Layer.GUI Layer.Audio Listener等4个组件,如下图. ClearFlags ...

  8. 海康威视摄像机Java SDK拉流(二)开启关闭实时预览

    本篇介绍海康威视摄像机通过SDK开启关闭实时预览接口 下篇介绍实时预览的回调函数及解码库 测试环境: 系统:Centos 7 SDK:设备网络SDK Linux64 实时预览模块流程: 图中虚线框部分 ...

  9. unity3d旋转摄像机脚本

    void Update () { )) { if (axes == RotationAxes.MouseXAndY) { // Read the mouse input axis rotationX ...

随机推荐

  1. 禁止输入中文 与 禁止输入数字在phonegap api环境效果

    例子如下: <!doctype html> <html> <head> <meta charset="utf-8"> <tit ...

  2. Python3基础 not in列表名 判断一个元素是否不在列表中列表中

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  3. C# Reportviewer 固定表头

    RDLC报表固定每页都显示表头以XML方式打开rdlc文件查找到<TablixRowHierarchy> <TablixMembers> <TablixMember> ...

  4. centos使用yum安装mysql

    参考:http://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/ 1.增加yum数据源 (1.1)从http://dev.mysql.com/dow ...

  5. Vim入门教程

    尽管网上有成打的Vim在线教程,但是要么艰深晦涩,要么太过肤浅.本教程的目标让每个阶段都有斩获,从理解它的哲学(将和你终身相伴)到超越现在编辑技巧,成为其中的牛人. 简单来说,本教程的学习方式将使你终 ...

  6. mysql5.x(<7) sql文件导入到5.7

    一.修改sql—model http://www.linuxidc.com/Linux/2016-09/135372.htm

  7. RMAN的入门篇

    一.RMAN连接数据库 1.  连接本地数据库 [oracle@oracle hotbak]$ export oracle_sid=orcl [oracle@oracle hotbak]$ rman ...

  8. MFC编程入门之九(对话框:为控件添加消息处理函数)

    这一节讲的主要内容是如何为控件添加消息处理函数. MFC为对话框和控件定义了诸多消息,我们对他们操作时会触发消息,这些消息最终由消息处理函数处理,比如我们点击按钮时就会产生BN_CLICKED消息,修 ...

  9. iOS开发 ReactiveCocoa入门教程 第二部分

    ReactiveCocoa 是一个框架,它允许你在你的iOS程序中使用函数响应式(FRP)技术.加上第一部分的讲解,你将会学会如何使用信号量(对事件发出数据流)如何替代标准的动作和事件处理逻辑.你也会 ...

  10. 课时8—弹窗modal

    首先弹窗的实现效果如下: 主要实现的代码如下: CSS: .header,.footer,.wrap-page{ position:absolute; left:; right:; backgroun ...