2017-09-12 17:25:00 Lyon_Nee 阅读数 1164

将脚本直接挂在当前想要通过手势旋转的摄像头或其他游戏物体上.


using UnityEngine;

public class TouchTest : MonoBehaviour
{
    public float xSpeed = 100;//旋转速度
    public float ySpeed = 100;
    public float yMinLimit = -20;//旋转限制
    public float yMaxLimit = 80;
    public float x = 0.0f;
    public float y = 0.0f;
    void Start()
    {
        Vector2 angles = transform.eulerAngles;
        x = angles.y;
        y = angles.x;
    }

    void Update()
    {
        if (Input.touchCount == 1)
        {
            if (Input.GetTouch(0).phase==TouchPhase.Moved)
            {
                x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
                y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
            }
        }
    }

    public void LateUpdate()
    {
        y = ClampAngle(y, yMinLimit, yMaxLimit);
        Quaternion rotation = Quaternion.Euler(y, x, 0);
        transform.rotation = rotation;

    }

    /// <summary>
    /// Y值的限制
    /// </summary>
    float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;

        if (angle > 360)
            angle -= 360;

        return Mathf.Clamp(angle, min, max);
    }
}


2019-02-18 16:50:16 FransicZhang 阅读数 1046

 在游戏和一些产品展示等项目中会有让摄像机围绕某个物体进行旋转这种需求 

下面展示的代码是个删减版的  只保留了主要功能   限制的方面都删除了

在原有的代码中有  移动摄像机功能 围绕的点不做限制每帧都在变化   还有移动的范围限制  旋转的角度限制   还有触发层级的限制   UI误触限制等。。   

使用的过程中可以根据自己的需求来添加

在实际的使用中可能会有限制的需求  比如最大远离多少  最近距离多少   不能旋转到地面以下等

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

//摄像机操作   
//删减版   在实际的使用中可能会有限制的需求  比如最大远离多少  最近距离多少   不能旋转到地面以下等
public class CamCtrl : MonoBehaviour
{
    public Transform CenObj;//围绕的物体
    private Vector3 Rotion_Transform;
    private new Camera camera;
    void Start()
    {
        camera = GetComponent<Camera>();
        Rotion_Transform = CenObj.position;
    }
    void Update()
    {
        Ctrl_Cam_Move();
        Cam_Ctrl_Rotation();
    }
    //镜头的远离和接近
    public void Ctrl_Cam_Move()
    {
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
        {
            transform.Translate(Vector3.forward * 1f);//速度可调  自行调整
        }
        if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            transform.Translate(Vector3.forward * -1f);//速度可调  自行调整
        }
    }
    //摄像机的旋转
    public void Cam_Ctrl_Rotation()
    {
        var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
        var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
        if (Input.GetKey(KeyCode.Mouse1))
        {
            transform.RotateAround(Rotion_Transform, Vector3.up, mouse_x * 5);
            transform.RotateAround(Rotion_Transform, transform.right, mouse_y * 5);
        }
    }
}

2018-04-28 12:08:12 zjq2008wd 阅读数 7561

第一种,使用Transform 函数 RotateAround。

代码如下:

public Transform target;//获取旋转目标

private void camerarotate() //摄像机围绕目标旋转操作
    {
        transform.RotateAround(target.position, Vector3.up, speed*Time.deltaTime); //摄像机围绕目标旋转
        var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
        var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
        if (Input.GetKey(KeyCode.Mouse1))
        {
            transform.Translate(Vector3.left*(mouse_x*15f)*Time.deltaTime);
            transform.Translate(Vector3.up*(mouse_y*15f)*Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.Mouse0))
        {
            transform.RotateAround(target.transform.position, Vector3.up, mouse_x*5);
            transform.RotateAround(target.transform.position, transform.right, mouse_y*5);
        }
    }

    private void camerazoom() //摄像机滚轮缩放
    {
        if (Input.GetAxis("Mouse ScrollWheel") > 0)
            transform.Translate(Vector3.forward*0.5f);


        if (Input.GetAxis("Mouse ScrollWheel") < 0)
            transform.Translate(Vector3.forward*-0.5f);
    }

作者:白水SR
链接:https://www.jianshu.com/p/dbd5c82cfb74
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

如果出于某些特殊情况,比如被面试要求不允许使用RotateAround函数,或者非Unity平台等等。可以考虑使用四元数。

代码如下:

 void MyRotateAround(Vector3 center, Vector3 axis, float angle)
    {
        Vector3 pos = transform.position;
        Quaternion rot = Quaternion.AngleAxis(angle, axis);
        Vector3 dir = pos - center; //计算从圆心指向摄像头的朝向向量
        dir = rot * dir;            //旋转此向量
        transform.position = center + dir;//移动摄像机位置
        var myrot = transform.rotation;
        //transform.rotation *= Quaternion.Inverse(myrot) * rot *myrot;//设置角度另一种方法
        transform.rotation = rot * myrot; //设置角度
    }




2017-06-05 15:49:02 u014686875 阅读数 1935

1.实现思路:操作摄像头围绕物体中心点(远点),做球面旋转移动来实现旋转观察物体,控制球的半径大小来实现物体的缩放效果。
2.C#摄像头源码脚本

//放在摄像头上,实现旋转、缩放观察物体
using UnityEngine;

public class BaseCam : MonoBehaviour
{

    public Vector3 mousePos1;                           //记录鼠标点下去瞬间的位置
    public Vector3 mousePos2;                           //记录鼠标任何时刻的位置
    public Quaternion start_qua;                        //角度使用四元数
    public Vector3 start_pos;                           //位置坐标

    // Use this for initialization
    void Start()
    {
        //记录相机开始的角度与位置
        start_qua = transform.rotation;
        start_pos = transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        //记录鼠标实时移动的点
        mousePos2 = Input.mousePosition;                
    }

    void OnGUI()
    {
        //鼠标左键
        if (Input.GetMouseButton(0))
        {
            mousePos1 = Input.mousePosition;            //记录鼠标点击瞬间的点
            Vector3 offset = mousePos1 - mousePos2;     //记录鼠标移动的距离

            //上下与左右 旋转分开,绝对值比较
            if (Mathf.Abs(offset.x) > Mathf.Abs(offset.y))
            {
                //以物体上方为旋转轴(Vector3.up == new Vector3(0, 1.0f, 0)),物体左右旋转角度与鼠标横向移动距离相关,变化速率2f
                transform.RotateAround(new Vector3(0, 0, 0), Vector3.up, Time.deltaTime * offset.x * 2f);         
            }
            else
            {
                //以世界坐标右方为旋转轴(transform.right,是会变化的量),物体上下旋转角度与鼠标纵向移动距离相关,变化速率2f
                transform.RotateAround(new Vector3(0, 0, 0), transform.right, -Time.deltaTime * offset.y * 2f);
            }

            //打印数据transform.right变量
            Debug.Log("pos: " + transform.right);
        }
        //鼠标中键,物体恢复原来的角度与位置
        if (Input.GetMouseButton(2))
        {
            transform.rotation = start_qua;
            transform.position = start_pos;
        }
        //鼠标中键滑动,物体缩放,摄像头前后移动距离范围在2f~5f,变化速率3f
        if (Input.GetAxis("Mouse ScrollWheel") > 0f && Vector3.Distance(transform.position, new Vector3(0, 0, 0)) > 2f)
        {
            transform.Translate(Vector3.forward * Time.deltaTime * Input.GetAxis("Mouse ScrollWheel") * 5f);
        }
        if (Input.GetAxis("Mouse ScrollWheel") < 0f && Vector3.Distance(transform.position, new Vector3(0, 0, 0)) <5f)
        {
            transform.Translate(Vector3.back * Time.deltaTime * (-Input.GetAxis("Mouse ScrollWheel")) * 5f);
        }
    }
}
2019-05-29 18:53:44 l1606468155 阅读数 227

最近做游戏碰到一个功能:模拟Unity Scene视图中的效果,让视线围绕着屏幕旋转。而在游戏视图中对应的就是让摄像机围绕屏幕中心旋转。这个功能在很多的建模软件中都可以看的到。
在设计这个功能的时候,也参照了一些别人的代码,有计算欧拉角的,也有直接旋转摄像机的,但是效果都不是很理想,最后还是借助了一个空物体实现了。
思路大致如下:
首先找到屏幕的正中心位置,并在这个位置的前面一点放置一个空物体,当捕捉到鼠标右键按下时,则计算偏移量,并让摄像机围绕那个空物体旋转(想象一下公转)。当开始按下时,就确定那个物体的位置,然后按紧的时候不更新空物体位置,就能保证摄像机转了一圈还是在原来的位置。
ShowCode:

if (Input.GetMouseButtonDown(1))
{
	if (center==null)
	{
		center = new GameObject();
	}
	center.transform.position = transform.position + transform.forward * 10;
}
if (Input.GetMouseButton(1))
{
	float h = Input.GetAxis("Mouse X") * xSpeed * Time.deltaTime;
	float v = Input.GetAxis("Mouse Y") * ySpeed * Time.deltaTime;
	transform.RotateAround(center.transform.position, Vector3.up, h);
	transform.RotateAround(center.transform.position, Vector3.right*-1, v);
}

这里的xSpeed和ySpeed可以设置一个滑条的值,然后玩家可以通过设置滑条的值来设置鼠标灵敏度。

没有更多推荐了,返回首页