在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. noi 4978 宠物小精灵之收服

    题目链接:http://noi.openjudge.cn/ch0206/4978/ 二维费用背包 在最后找还剩多少体力的时候,直接找到第二维,当结果 f[n][i] == f[n][m] 时,就说明已 ...

  2. Android--菜单详解

    Android中的菜单分为三种,即选项菜单(系统菜单),上下文菜单和弹出式菜单. 选项菜单: 一个activity只有一个选项菜单,选项菜单的创建方式有低版本创建和高版本创建两种.最常用的是干版本创建 ...

  3. php实战正则表达式:验证手机号

    摘自http://www.tuicool.com/articles/MFNZRzu 本文通过逐步完善一个验证手机号的正则表达式来介绍了正则表达式中的 字符组 .量词 . 字符串起始/结束位置 . 分组 ...

  4. java内部类以及匿名类

    内部类 一个类内部定义的类称为内部类. 内部类允许把逻辑相关的类组织在一起,并控制内部代码的可视性. 内部类与外部类的结构层次如下. 顶层类:最外层的类 外部类:内部类所在的类 内部类:类内部定义的类 ...

  5. PHP文本框的值随下拉框改变

    初学PHP,下面是实现文本框内容随下拉框变化的代码实现: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  6. sqlAlchemy 按DateTime字段的年或月进行group_by查询

    一.根据”create_date“查询每天的数据 1.查询2016年5月每天的数据 session.query(extract('day', User.create_date).label('day' ...

  7. combobox获取值

    easyui-combobox是组合框 ,既可以输入,也可以选择 获取的数据是json格式的  [{"id":"001","text":&q ...

  8. c#简易反射调用泛型方法

    // 所谓程序集的简单理解,存在不同项目中(不是解决方案),即using前需要引用**.dll 1.调用当前类文件下的方法public List<T> GetByCondition< ...

  9. Java 编程入门(词汇表)

    抽象类(abstract class):抽象类不能创建对象,主要用来创建子类.Java中的抽象类使用 abstract 修饰符定义. 抽象数据类型(abstract data type ADT):抽象 ...

  10. Web移动应用调试工具——Weinre

    如今人们也越来越习惯在手机上浏览网页,而在手机上这些针对桌面浏览器设计的网页经常惨不忍睹.Web应用开发者需要针对手机进行界面的重新设计,但是手机上并没有称心如意的调试工具(如Firebug.web ...