zoukankan      html  css  js  c++  java
  • Unity:Camra相机

    1. 将屏幕坐标转换成世界坐标

    Camera.main.ScreenToWorldPoint(Input.mousePosition);   X    //将鼠标点击的坐标转换成世界坐标

    注意:该输出为一个固定坐标,转换失败。因为mousePosition是屏幕坐标(x,y,0),z轴是点与相机的距离。

     1 public class Move : MonoBehaviour
     2 {
     3     private Vector3 offset;  //加一个偏移量,操作更丝滑
     4     private void OnMouseDown()
     5     {
     6         float sreenZ = Camera.main.WorldToScreenPoint(transform.position).z;
     7         offset = transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, sreenZ));
     8     }
     9     private void OnMouseDrag()
    10     {
    11         Vector3 screenPos = Input.mousePosition;
    12         float screenZ = Camera.main.WorldToScreenPoint(transform.position).z;
    13         transform.position = Camera.main.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, screenZ)) + offset;
    14     }
    15 }
    用鼠标拖拽一个物体

    2. 将屏幕坐标转换成射线

    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition)  //使用主相机创建一条射线,射线方向是鼠标点击的位置

    案例1. 2D场景相机跟随(相机会跟随人物上下左右移动)

     1     //相机跟随的速度
     2     private float speedX = 2;  
     3     private float speedY = 5;
     4     //人物与相机距离多少时开始移动
     5     private float distance = 1; 
     6     //移动边界限制
     7     private float minPosX = -2.5f;  
     8     private float maxPosX = 2.5f;
     9     private float minPosY = -2.5f;
    10     private float maxPosY = 2.5f;
    11     private void Update()
    12     {
    13         float disX = player.position.x - transform.position.x;
    14         float disY = player.position.y - transform.position.y;
    15         if (disX > distance)
    16         {
    17             transform.position = new Vector3(transform.position.x + speedX * Time.deltaTime, transform.position.y, transform.position.z);
    18         }
    19         if (disX < -distance)
    20         {
    21             transform.position = new Vector3(transform.position.x - speedX * Time.deltaTime, transform.position.y, transform.position.z);
    22         }
    23         //限制移动区域
    24         float realPosX = Mathf.Clamp(transform.position.x, minPosX, maxPosX);
    25         if (disY > distance)
    26         {
    27             transform.position = new Vector3(realPosX, transform.position.y + speedY * Time.deltaTime, transform.position.z);
    28         }
    29         if (disY < -distance)
    30         {
    31             transform.position = new Vector3(realPosX, transform.position.y - speedY * Time.deltaTime, transform.position.z);
    32         }
    33         float realPosY = Mathf.Clamp(transform.position.y, minPosY, maxPosY);
    34         transform.position = new Vector3(realPosX, realPosY, transform.position.z);
    35     }

    案例2. 3D场景相机跟随(角色被挡住,相机滑动到能看到角色位置)

    通过代码设置观察点,找到能看见目标的观察点

    通过Cinemachine制作

    直接把相机移到遮挡处遮挡物变透明

    案例3. 添加小地图

    1.将相机看到的内容渲染到一张图上(小地图同步)

    1)新建一个材质Render Texture

    2)将材质放在相机Target Texture上

    3)新建一个UI-->Raw Image

    4)将材质放在Raw Image --> Texture上

    5)在Scene视角里调整好小窗口的位置

    6)复制一个相机,去掉Target Texture里的材质

    最终实现效果:

  • 相关阅读:
    C:表达式、语句、声明
    SAIO Swift All In One Diablo版 安装指南 Alpha
    Python自然语言处理学习笔记(60):7.1 信息抽取
    Python自然语言处理学习笔记(59):练习
    Python自然语言处理学习笔记(62):7.3 开发和评价分块器
    doctest模块的使用说明
    Python自然语言处理学习笔记(61):7.2 分块
    Python自然语言处理学习笔记(57):小结
    使用cURL操作Openstack对象存储的ReST API
    认证系统
  • 原文地址:https://www.cnblogs.com/tomatokely/p/15332832.html
Copyright © 2011-2022 走看看