2018-11-14 16:53:50 a380331382 阅读数 2618
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4633 人正在学习 去看看 张刚

Unity使用鼠标旋转缩放平移视角


用代码在Game界面完美实现Scene界面的操作方法。

使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上。

视角跟踪的是一个空物体,当然如果你是做RPG游戏需要跟踪某一角色的视角,那就不需要中键平移功能,把空物体换成角色就行。

代码主要是分三部分功能进行实现。

  1. 右键拖动控制视角的旋转;
  2. 滚轮旋转控制视角的缩放;
  3. 中键拖动控制视角的平移。

右键拖动控制旋转主要是用GetAxis获得鼠标在x方向与y方向平移的距离,相机的旋转是通过旋转相机本体坐标系的x轴与y轴实现的,重要的是在旋转相机的同时,要控制相机和target物体的相对距离,即同时控制相机绕target物体的旋转。这个网上多数实现都相同,不赘述

中键滚轮控制视角的缩放,定义Distance变量控制相机与target的距离(相机z轴方向的距离),用GetAxis获得滚轮旋转的程度,控制Distance的变动。这里和网上已有的方法也没什么区别。

中键拖动控制视角的平移,之前在网上查找相关的实现,结果实际效果都比较差,所以自己实现了一下。视角的平移是通过获取中键在屏幕坐标系下的平移的方向向量,然后转换为世界坐标系下的target坐标的平移,然后调整相机的位置进行相应的平移以保证旋转和缩放不受影响。

屏幕坐标系的平移转换到世界坐标系下的平移,本质上就是世界坐标系下沿着相机的本体坐标系的x与y轴进行相应的平移。所以只需要求出屏幕坐标系x与y方向的平移,分别乘以相机x与y轴的方向向量,然后与target原来的坐标相加,就可以获得target平移后的位置,再将相机的位置平移过去即实现了视角的平移,这种平移保证了相机平面和target之间的相对距离保持不变。具体代码如下:

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

public class MouseLookTest : MonoBehaviour {

	//相机跟随的目标物体,一般是一个空物体
	public Transform target;
	private int MouseWheelSensitivity = 1; //滚轮灵敏度设置
	private int MouseZoomMin = 1; //相机距离最小值
	private int MouseZoomMax = 20; //相机距离最大值

	private float moveSpeed = 10; //相机跟随速度(中键平移时),采用平滑模式时起作用,越大则运动越平滑

	private float xSpeed = 250.0f; //旋转视角时相机x轴转速
	private float ySpeed = 120.0f; //旋转视角时相机y轴转速

	private int yMinLimit = -360;
	private int yMaxLimit = 360;

	private float x = 0.0f; //存储相机的euler角
	private float y = 0.0f; //存储相机的euler角

	private float Distance = 5; //相机和target之间的距离,因为相机的Z轴总是指向target,也就是相机z轴方向上的距离
	private Vector3 targetOnScreenPosition; //目标的屏幕坐标,第三个值为z轴距离
	private Quaternion storeRotation; //存储相机的姿态四元数
	private Vector3 CameraTargetPosition; //target的位置
	private Vector3 initPosition; //平移时用于存储平移的起点位置
	private Vector3 cameraX; //相机的x轴方向向量
	private Vector3 cameraY; //相机的y轴方向向量
	private Vector3 cameraZ; //相机的z轴方向向量

	private Vector3 initScreenPos; //中键刚按下时鼠标的屏幕坐标(第三个值其实没什么用)
	private Vector3 curScreenPos; //当前鼠标的屏幕坐标(第三个值其实没什么用)
	void Start () {
		//这里就是设置一下初始的相机视角以及一些其他变量,这里的x和y。。。是和下面getAxis的mouse x与mouse y对应
		var angles = transform.eulerAngles;
		x = angles.y;
		y = angles.x;
		CameraTargetPosition = target.position;
		storeRotation = Quaternion.Euler (y + 60, x, 0);
		transform.rotation = storeRotation; //设置相机姿态
		Vector3 position = storeRotation * new Vector3 (0.0F, 0.0F, -Distance) + CameraTargetPosition; //四元数表示一个旋转,四元数乘以向量相当于把向量旋转对应角度,然后加上目标物体的位置就是相机位置了
		transform.position = storeRotation * new Vector3 (0, 0, -Distance) + CameraTargetPosition; //设置相机位置

		// Debug.Log("Camera x: "+transform.right);
		// Debug.Log("Camera y: "+transform.up);
		// Debug.Log("Camera z: "+transform.forward);

		// //-------------TEST-----------------
		// testScreenToWorldPoint();

	}

	void Update () {
		//鼠标右键旋转功能
		if (Input.GetMouseButton (1)) {
			x += Input.GetAxis ("Mouse X") * xSpeed * 0.02f;
			y -= Input.GetAxis ("Mouse Y") * ySpeed * 0.02f;

			y = ClampAngle (y, yMinLimit, yMaxLimit);

			storeRotation = Quaternion.Euler (y + 60, x, 0);
			var position = storeRotation * new Vector3 (0.0f, 0.0f, -Distance) + CameraTargetPosition;

			transform.rotation = storeRotation;
			transform.position = position;
		} else if (Input.GetAxis ("Mouse ScrollWheel") != 0) //鼠标滚轮缩放功能
		{
			if (Distance >= MouseZoomMin && Distance <= MouseZoomMax) {
				Distance -= Input.GetAxis ("Mouse ScrollWheel") * MouseWheelSensitivity;
			}
			if (Distance < MouseZoomMin) {
				Distance = MouseZoomMin;
			}
			if (Distance > MouseZoomMax) {
				Distance = MouseZoomMax;
			}
			var rotation = transform.rotation;

			transform.position = storeRotation * new Vector3 (0.0F, 0.0F, -Distance) + CameraTargetPosition;
		}

		//鼠标中键平移
		if (Input.GetMouseButtonDown (2)) {
			cameraX = transform.right;
			cameraY = transform.up;
			cameraZ = transform.forward;

			initScreenPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, targetOnScreenPosition.z);
			Debug.Log ("downOnce");

			//targetOnScreenPosition.z为目标物体到相机xmidbuttonDownPositiony平面的法线距离
			targetOnScreenPosition = Camera.main.WorldToScreenPoint (CameraTargetPosition);
			initPosition = CameraTargetPosition;
		}

		if (Input.GetMouseButton (2)) {
			curScreenPos = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, targetOnScreenPosition.z);
			//0.01这个系数是控制平移的速度,要根据相机和目标物体的distance来灵活选择
			target.position = initPosition - 0.01f * ((curScreenPos.x - initScreenPos.x) * cameraX + (curScreenPos.y - initScreenPos.y) * cameraY);

			//重新计算位置
			Vector3 mPosition = storeRotation * new Vector3 (0.0F, 0.0F, -Distance) + target.position;
			transform.position = mPosition;

			// //用这个会让相机的平移变得更平滑,但是可能在你buttonup时未使相机移动到应到的位置,导致再进行旋转与缩放操作时出现短暂抖动
			//transform.position=Vector3.Lerp(transform.position,mPosition,Time.deltaTime*moveSpeed);

		}
		if (Input.GetMouseButtonUp (2)) {
			Debug.Log ("upOnce");
			//平移结束把cameraTargetPosition的位置更新一下,不然会影响缩放与旋转功能
			CameraTargetPosition = target.position;
		}

	}

	//将angle限制在min~max之间
	static float ClampAngle (float angle, float min, float max) {
		if (angle < -360)
			angle += 360;
		if (angle > 360)
			angle -= 360;
		return Mathf.Clamp (angle, min, max);
	}

	void testScreenToWorldPoint () {
		//第三个坐标指的是在相机z轴指向方向上的距离
		Vector3 screenPoint = Camera.main.WorldToScreenPoint (CameraTargetPosition);
		Debug.Log ("ScreenPoint: " + screenPoint);

		// var worldPosition = Camera.main.ScreenToWorldPoint(new Vector3(1,1,10));
		// Debug.Log("worldPosition: "+worldPosition);
	}
}

实现的效果如下图:
在这里插入图片描述

demo工程在此下载:
https://github.com/JinghanSun/MouseLookDemoWithUnity3D

2018-01-04 10:15:53 q764424567 阅读数 2666
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4633 人正在学习 去看看 张刚

Unity3d 鼠标和键盘控制摄像机的视角缩放与扩大、视角平移、视角旋转

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

public class Mouse_Controller : MonoBehaviour
{
    public float xRoatationSpeed = 250.0f;
    public float yRoatationSpeed = 120.0f;

    public float moveSpeed = 800f;

    public float yRoatationMinLimit = -90f;
    public float yRoatationMaxLimit = 90f;

    public float ScaleSpeed = 300;

    public float KeyboardMoveSpeed = 10;
    public float DefaultKeyboardMoveSpeed = 10;
    public float KeyboardMoveAcceleratedSpeed = 3;

    public float MaxMoveDistance = 5000f;

    private KeyCode _forwardKey = KeyCode.W;

    public KeyCode ForwardKey
    {
        get { return _forwardKey; }
        set { _forwardKey = value; }
    }

    private KeyCode _backKey = KeyCode.S;

    public KeyCode BackKey
    {
        get { return _backKey; }
        set { _backKey = value; }
    }

    private KeyCode _leftKey = KeyCode.A;

    public KeyCode LeftKey
    {
        get { return _leftKey; }
        set { _leftKey = value; }
    }

    private KeyCode _rightKey = KeyCode.D;

    public KeyCode RightKey
    {
        get { return _rightKey; }
        set { _rightKey = value; }
    }
    private void Update()
    {
        Vector3 intos = gameObject.transform.position;
        if (intos.y<-5600)
        {
            moveSpeed = 80f;
            ScaleSpeed = 30f;
        }
        else if (intos.y >-5600)
        {
            moveSpeed = 800f;
            ScaleSpeed = 3000f;
        }
    }

    void Awake()
    {

    }

    void Start()
    {
    }

    void LateUpdate()
    {
        Vector3 oldPos = this.transform.position;

        //鼠标左键
        if (Input.GetMouseButton(0))
        {
            var position = transform.position;
            position += transform.TransformDirection(Vector3.left).normalized * (Input.GetAxis("Mouse X") * moveSpeed * 0.02f);
            position += transform.TransformDirection(Vector3.down).normalized * (Input.GetAxis("Mouse Y") * moveSpeed * 0.02f);

            movePosition(position);
        }

        ////鼠标右键
        //if (Input.GetMouseButton(1))
        //{
        //    float x = 0;
        //    float y = 0;

        //    x += Input.GetAxis("Mouse X") * xRoatationSpeed * 0.02f;
        //    y -= Input.GetAxis("Mouse Y") * yRoatationSpeed * 0.02f;

        //    y = ClampAngle(y, yRoatationMinLimit, yRoatationMaxLimit);

        //    transform.Rotate(y, x, 0);

        //    var angles = transform.eulerAngles;
        //    angles.z = 0;

        //    transform.eulerAngles = angles;
        //}

        //鼠标滑轮
        if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            var moveDistance = Input.GetAxis("Mouse ScrollWheel") * ScaleSpeed;

            var position = transform.position;
            position += transform.TransformDirection(Vector3.forward).normalized * moveDistance;

            movePosition(position);
        }

        if (Input.GetKey(ForwardKey))
        {
            var position = transform.position;
            position += transform.TransformDirection(Vector3.forward).normalized * KeyboardMoveSpeed * 0.02f;

            movePosition(position);
        }

        if (Input.GetKey(BackKey))
        {
            var position = transform.position;
            position += transform.TransformDirection(Vector3.back).normalized * KeyboardMoveSpeed * 0.02f;

            movePosition(position);
        }

        if (Input.GetKey(LeftKey))
        {
            var position = transform.position;
            position += transform.TransformDirection(Vector3.left).normalized * KeyboardMoveSpeed * 0.02f;

            movePosition(position);
        }

        if (Input.GetKey(RightKey))
        {
            var position = transform.position;
            position += transform.TransformDirection(Vector3.right).normalized * KeyboardMoveSpeed * 0.02f;

            movePosition(position);
        }

        if (Input.GetKey(ForwardKey) || Input.GetKey(BackKey) || Input.GetKey(LeftKey) || Input.GetKey(RightKey))
        {
            KeyboardMoveSpeed += KeyboardMoveAcceleratedSpeed * 0.02f;
        }
        else
        {
            KeyboardMoveSpeed = DefaultKeyboardMoveSpeed;
        }

        if (Vector3.Distance(transform.position, Vector3.zero) > MaxMoveDistance)
        {
            movePosition(oldPos + oldPos.normalized * -100);
        }
    }

    void movePosition(Vector3 moveToPosition)
    {
        if (transform.GetComponent<Rigidbody>())
        {
            if (!Physics.Raycast(transform.position, moveToPosition - transform.position, (moveToPosition - transform.position).magnitude))
            {
                transform.GetComponent<Rigidbody>().MovePosition(moveToPosition);
            }
        }
    }

    float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
}

代码主要功能就是控制是摄像机的视角的缩放与扩大、视角平移、视角旋转
主要控制的代码:

void movePosition(Vector3 moveToPosition)
    {
        if (transform.GetComponent<Rigidbody>())
        {
            if (!Physics.Raycast(transform.position, moveToPosition - transform.position, (moveToPosition - transform.position).magnitude))
            {
                transform.GetComponent<Rigidbody>().MovePosition(moveToPosition);
            }
        }
    }

很明显是控制是摄像机的Rigidbody来实现移动的
所以在摄像机上不仅要加上上面这一段代码,而且还要加上Rigidbody组件才能有效果
然后代码的参数都可以修改
如果修改不了可以把下面的代码注释掉

private void Update()
{
Vector3 intos = gameObject.transform.position;
if (intos.y<-5600)
{
moveSpeed = 80f;
ScaleSpeed = 30f;
}
else if (intos.y >-5600)
{
moveSpeed = 800f;
ScaleSpeed = 3000f;
}
}

OK 感觉没有什么要注释的了
复用性很高 值得借鉴哦

2017-05-02 16:38:03 yongh701 阅读数 23940
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4633 人正在学习 去看看 张刚

在3D游戏里面,视角是一个很重要的因素,部分玩家对锁视角嗤之以鼻,因此视角也是游戏制作里面需要努力的方面。其实也不难,换到Unity3D里面是想办法控制摄像机的移动。下面举一个简单的例子说明在Unity3D如何用键盘鼠标控制视角的移动的。如下图所示:


就像大部分游戏一样,可以用鼠标滚轮控制视角的远近,键盘的wasd和上下左右控制镜头的位置,而按着鼠标右键则可以控制镜头的旋转。当然你可以根据需要改成其它控制方式,反正原理是同一个原理。

其实这个游戏场景布置非常非常简单,也不是本文的重点。如下图所示,基本能够一览无遗:


如上图所示,我们其实需要做的,只是控制Main Camera的位置和旋转则能够做到上面的效果。因此赋予给Main Camera,如下的脚本CameraMove.cs:

using UnityEngine;
using System.Collections;

public class CameraMove : MonoBehaviour
{
    public float sensitivityMouse = 2f;
    public float sensitivetyKeyBoard = 0.1f;
    public float sensitivetyMouseWheel = 10f;

    void Update()
    {
        //滚轮实现镜头缩进和拉远
        if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            this.camera.fieldOfView = this.camera.fieldOfView - Input.GetAxis("Mouse ScrollWheel") * sensitivetyMouseWheel;
        }
        //按着鼠标右键实现视角转动
        if (Input.GetMouseButton(1))
        {
            transform.Rotate(-Input.GetAxis("Mouse Y") * sensitivityMouse, Input.GetAxis("Mouse X") * sensitivityMouse, 0);
        }

        //键盘按钮←/a和→/d实现视角水平移动,键盘按钮↑/w和↓/s实现视角水平旋转
        if (Input.GetAxis("Horizontal") != 0)
        {
            transform.Translate(Input.GetAxis("Horizontal") * sensitivetyKeyBoard, 0, 0);
        }
        if (Input.GetAxis("Vertical") != 0)
        {
            transform.Translate(0, Input.GetAxis("Vertical") * sensitivetyKeyBoard, 0);
        }
    }

}

鼠标右键点击的监听这里就不说了,在《【Unity3D】用鼠标点击事件、AddForce完成跳跃与二段跳》(点击打开链接)已经详细说过了。这里引用了Input.GetAxis的概念。理论上,你可以像《【Unity3D】利用物体碰撞检测、键盘输入处理完成平衡球游戏》(点击打开链接)那样控制物体移动那样,控制主摄像机的移动与旋转的,但是使用Input.GetAxis会让你代码更加简洁,在Unity3D中有18条轴,不过基本上常用轴就是上述代码的几个。

Input.GetAxis能够获取这个轴的输入,也就是同样是用来监听鼠标输入的一个东西,它将返回一个-1~1的数值。用于记录用户按键盘的时长、翻滚轮、鼠标对比上一个位置偏移的多少。这样的话,我们再乘上一个合适的float,则可以形成一个坐标位置。配合Rotate与Translate则能够时物体移动。

另一方面,摄像头的焦距,也就是缩放可以直接对fieldOfView控制而达成。

2016-05-13 15:12:46 andyhebear 阅读数 2103
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4633 人正在学习 去看看 张刚
各位朋友,大家好,我是秦元培,欢迎大家关注我的博主,我的博客地址是blog.csdn.net/qinyuanpei。最近博主重点研究了摄像机旋转、缩放等问题,那么今天为大家分享的是一个在3D展示中比较常用的功能,即通过鼠标右键实现旋转、鼠标滚轮实现缩放、鼠标中键实现平移。本文采用的方法依然是在[Unity3D]Unity3D游戏开发之自由视角下的角色控制这篇文章中所采用的方法,所以如果大家对于这部分内容不太了解的话,最好先去看看这篇文章。好了,下面我们将以一个具体的实例来讲解今天的内容。如图,是博主创建的一个简单地场景。我们希望实现通过鼠标右键实现对角色的旋转、鼠标滚轮实现对角色的缩放、鼠标中键实现对角色的平移。


    好了,接下来我们来创建一个名为FreeView的脚本,该脚本依附在主相机上,下面我们来看它的实现过程:

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class FreeView : MonoBehaviour {  
  5.   
  6.     //观察目标  
  7.     public Transform Target;  
  8.   
  9.     //观察距离  
  10.     public float Distance = 5F;  
  11.   
  12.     //旋转速度  
  13.     private float SpeedX=240;  
  14.     private float SpeedY=120;  
  15.   
  16.     //角度限制  
  17.     private float  MinLimitY = -180;  
  18.     private float  MaxLimitY = 180;  
  19.       
  20.     //旋转角度  
  21.     private float mX = 0.0F;  
  22.     private float mY = 0.0F;  
  23.       
  24.     //鼠标缩放距离最值  
  25.     private float MaxDistance=10;  
  26.     private float MinDistance=1.5F;  
  27.     //鼠标缩放速率  
  28.     private float ZoomSpeed=2F;  
  29.       
  30.     //是否启用差值  
  31.     public bool isNeedDamping=true;  
  32.     //速度  
  33.     public float Damping=10F;  
  34.   
  35.     //存储角度的四元数  
  36.     private Quaternion mRotation;  
  37.   
  38.     //定义鼠标按键枚举  
  39.     private enum MouseButton  
  40.     {  
  41.         //鼠标左键  
  42.         MouseButton_Left=0,  
  43.         //鼠标右键  
  44.         MouseButton_Right=1,  
  45.         //鼠标中键  
  46.         MouseButton_Midle=2  
  47.     }  
  48.   
  49.     //相机移动速度  
  50.     private float MoveSpeed=5.0F;  
  51.     //屏幕坐标  
  52.     private Vector3 mScreenPoint;  
  53.     //坐标偏移  
  54.     private Vector3 mOffset;  
  55.   
  56.     void Start ()   
  57.     {  
  58.         //初始化旋转角度  
  59.         mX=transform.eulerAngles.x;  
  60.         mY=transform.eulerAngles.y;  
  61.     }  
  62.       
  63.     void LateUpdate ()   
  64.     {  
  65.         //鼠标右键旋转  
  66.         if(Target!=null && Input.GetMouseButton((int)MouseButton.MouseButton_Right))  
  67.         {  
  68.             //获取鼠标输入  
  69.             mX += Input.GetAxis("Mouse X") * SpeedX * 0.02F;  
  70.             mY -= Input.GetAxis("Mouse Y") * SpeedY * 0.02F;  
  71.             //范围限制  
  72.             mY = ClampAngle(mY,MinLimitY,MaxLimitY);  
  73.             //计算旋转  
  74.             mRotation = Quaternion.Euler(mY, mX, 0);  
  75.             //根据是否插值采取不同的角度计算方式  
  76.             if(isNeedDamping){  
  77.                 transform.rotation = Quaternion.Lerp(transform.rotation,mRotation, Time.deltaTime*Damping);   
  78.             }else{  
  79.                 transform.rotation = mRotation;  
  80.             }  
  81.         }  
  82.   
  83.         //鼠标中键平移  
  84.   
  85.   
  86.         //鼠标滚轮缩放  
  87.         Distance-=Input.GetAxis("Mouse ScrollWheel") * ZoomSpeed;  
  88.         Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);  
  89.           
  90.         //重新计算位置  
  91.         Vector3 mPosition = mRotation * new Vector3(0.0F, 0.0F, -Distance) + Target.position;  
  92.           
  93.         //设置相机的位置  
  94.         if(isNeedDamping){  
  95.             transform.position = Vector3.Lerp(transform.position,mPosition, Time.deltaTime*Damping);   
  96.         }else{  
  97.             transform.position = mPosition;  
  98.         }  
  99.           
  100.     }  
  101.       
  102.       
  103.     //角度限制  
  104.     private float  ClampAngle (float angle,float min,float max)   
  105.     {  
  106.         if (angle < -360) angle += 360;  
  107.         if (angle >  360) angle -= 360;  
  108.         return Mathf.Clamp (angle, min, max);  
  109.     }  
  110. }  
大家是不是觉得这部分代码很熟悉?不错,这里的原理都是一样的,大家只要掌握核心原理就可以了,即首先根据鼠标输入来计算旋转角、然后通过滚轮输入计算距离、最后通过四元数运算计算相机的角度和距离。好了,我们来看看最终的效果吧!



         大家应该注意到博主没有实现按下鼠标中键平移的相关方法,因为这部分博主目前还没有彻底正确地写出来,如果大家知道的话,可以给博主留言,或者等博主什么时候想清楚了再来更新这篇博客吧。博主的博客会经常更新的,希望大家继续关注我的博客吧。好了,最后我们再来做一个迁移,我们将把这个功能移植到Android平台上,本来想把这部分作为Android手势控制单独写一篇文章的,可是感觉这里的代码都是相似的,再写一篇实在没有必要,所以,就直接给出代码吧!

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class MobileInput : MonoBehaviour {  
  5.   
  6.     //观察目标  
  7.     public Transform Target;  
  8.   
  9.     //观察距离  
  10.     public float Distance = 2F;  
  11.   
  12.     //距离最值  
  13.     public float MaxDistance=5F;  
  14.     public float MinDistance=0.5F;  
  15.   
  16.     //缩放速率  
  17.     private float ZoomSpeed=0.15F;  
  18.   
  19.     //旋转速度  
  20.     private float SpeedX=240;  
  21.     private float SpeedY=120;  
  22.     //角度限制  
  23.     private float  MinLimitY = 5;  
  24.     private float  MaxLimitY = 180;  
  25.       
  26.     //旋转角度  
  27.     private float mX=0;  
  28.     private float mY=0;  
  29.   
  30.     //当前手势  
  31.     private Vector2 mPos;  
  32.   
  33.     void Start ()   
  34.     {  
  35.         //允许多点触控  
  36.         Input.multiTouchEnabled=true;  
  37.         //初始化旋转  
  38.         mX=Target.eulerAngles.x;  
  39.         mY=Target.eulerAngles.y;  
  40.     }  
  41.   
  42.     void Update ()   
  43.     {  
  44.         if(!Target) return;  
  45.   
  46.   
  47.         //单点触控  
  48.         if(Input.touchCount==1)  
  49.         {  
  50.             //手指处于移动状态  
  51.             if(Input.touches[0].phase==TouchPhase.Moved)  
  52.             {  
  53.                 mX+=Input.GetAxis("Mouse X") * SpeedX * 0.02F;  
  54.                 mY-=Input.GetAxis("Mouse X") * SpeedY * 0.02F;  
  55.                 mY=ClampAngle(mY,MinLimitY,MaxLimitY);  
  56.             }  
  57.         }  
  58.   
  59.         //多点触控  
  60.         if(Input.touchCount>1)  
  61.         {  
  62.             //两只手指都处于移动状态  
  63.             if(Input.touches[0].phase==TouchPhase.Moved || Input.touches[1].phase==TouchPhase.Moved)  
  64.             {  
  65.                 //计算移动方向  
  66.                 Vector2 mDir=Input.touches[1].position-Input.touches[0].position;  
  67.                 //根据向量的大小判断当前手势是放大还是缩小  
  68.                 if(mDir.sqrMagnitude>mPos.sqrMagnitude){  
  69.                     Distance-=ZoomSpeed;  
  70.                 }else{  
  71.                     Distance+=ZoomSpeed;  
  72.                 }  
  73.                 //限制距离  
  74.                 Distance=Mathf.Clamp(Distance,MinDistance,MaxDistance);  
  75.                 //更新当前手势  
  76.                 mPos=mDir;  
  77.             }  
  78.         }  
  79.   
  80.         //计算相机的角度和位置  
  81.         transform.rotation=Quaternion.Euler(new Vector3(mY,mX,0));  
  82.         transform.position=transform.rotation * new Vector3(0,0,-Distance)+Target.position;  
  83.     }  
  84.   
  85.     //角度限制  
  86.     private float ClampAngle (float angle,float min,float max)   
  87.     {  
  88.         if (angle < -360) angle += 360;  
  89.         if (angle >  360) angle -= 360;  
  90.         return Mathf.Clamp (angle, min, max);  
  91.     }  
  92. }  


下面是程序在手机上运行过程中的截图









今天的内容就是这样子啦,博主最近在捣鼓Unity与Android对接的一些东西,等博主研究好了就分享给大家,希望大家喜欢。最后送上:


每日箴言:生活就是种律动,须有光有影,有左有右。人生就是一场无止境的漂泊。面对生活中那些触不及防的意外、突如其来的伤痛、从天而降的灾难,相信,只要有爱,就有足够的勇气去承受人生中所有的风雨,一切会变得轻松而释然。




2019-11-08 22:01:34 GXW_5201314 阅读数 12
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4633 人正在学习 去看看 张刚

以下为视角的旋转实现方式(仅供参考)

using UnityEngine;

public class camera_controller : MonoBehaviour
{
    public GameObject _camera;
    private Vector3 rot = new Vector3(0, 0, 0);
    //鼠标速度
    private int mousespeed = 100;

    private void FixedUpdate()
    {
        //运行环境为Windows
        if (Application.platform == RuntimePlatform.WindowsPlayer)
        {
            rot.y += Input.GetAxis("Mouse X") * mousespeed * Time.deltaTime;
            rot.x = rot.x - Input.GetAxis("Mouse Y") * mousespeed * Time.deltaTime;
            if (rot.x >= 90)
            {
                rot.x = 90;
            }
            if (rot.x <= -90)
            {
                rot.x = -90;
            }
            _camera.transform.localEulerAngles = rot;
        }
        //运行环境为安卓
        else if (Application.platform == RuntimePlatform.Android)
        {
            if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
            {
                rot.x -= Input.GetTouch(0).deltaPosition.y * 0.1f;
                if (rot.x >= 90)
                {
                    rot.x = 90;
                }
                if (rot.x <= -90)
                {
                    rot.x = 90;
                }
                rot.y += Input.GetTouch(0).deltaPosition.x * 0.1f;
                _camera.transform.localEulerAngles = rot;
            }
        }
    }
}
没有更多推荐了,返回首页