Unity右键旋转,滚轮缩放,中键平移,跟随玩家

一、以摄像机为中心,右键旋转

将脚本挂载到摄像机上,以摄像机为中心旋转视野

    private Vector2 offs;
    public float speed=2;
	void Start () {
        offs = transform.eulerAngles;
	}
	void Update () {
        if (Input.GetMouseButton(1))     //用户交互的键入
        {
            offs += new Vector2(Input.GetAxis("Mouse Y"), Input.GetAxis("Mouse X"))*speed;   //摄像机旋转的控制
            transform.eulerAngles = offs;
        }
	}

二、以物体为中心,右键旋转,滚轮缩放,中键平移

脚本挂载到摄像机上

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
 * 以物体target为中心
 * 右键上下左右旋转
 * 滚轮视野拉近拉远
 * 中键平移场景
 */
public class CameraController : MonoBehaviour
{	
	public Transform target;//相机跟随的目标物体,一般是一个空物体;没有需要为中心的物体时,为摄像机即可,target=gameObject.transform;
	private int MouseWheelSensitivity = 1; //滚轮灵敏度设置
	private int MouseZoomMin = 1; //相机距离最小值
	private int MouseZoomMax = 20; //相机距离最大值

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

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

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

	private float Distance = 0; //相机和target之间的距离
	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, x, 0);
		transform.rotation = storeRotation; //设置相机姿态

		Distance = (transform.position - target.position).magnitude;
		//四元数表示一个旋转,四元数乘以向量相当于把向量旋转对应角度,然后加上目标物体的位置就是相机位置了
		transform.position = storeRotation * new Vector3(0, 0, -Distance) + CameraTargetPosition; //设置相机位置
	}

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

			//上下旋转的限制角度
			y = ClampAngle(y, 40, 120);
			//左右旋转的限制角度
			x = ClampAngle(x, 40, 80);

			storeRotation = Quaternion.Euler(y, 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;
			}
			
			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);
			
			//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))
		{
			//平移结束把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);
	}
	
}

三、摄像机跟随玩家

一种简单的方法是把Camera直接拖到Player下面作为Player的子物体,另一种方法是取得Camera与Player的偏移向量,并据此设置Camera位置。
脚本挂在在Camera上

public class FollowPlayer : MonoBehaviour {

        private Transform player;
        private Vector3 offsetPosition;

    // Use this for initialization
    void Start () {
        player = GameObject.FindGameObjectWithTag(“Player”).transform;
        offsetPosition = transform.position - player.position;
        transform.LookAt(player.position);
    }

    // Update is called once per frame
    void Update () {
        transform.position = offsetPosition + player.position;

    }
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中,我们可以通过编写代码来实现物体的旋转缩放功能。首先,我们需要添加一个脚本到我们的物体上,这个脚本将被用来监听用户的输入。在脚本中,我们可以使用Input类来获取用户的输入。 要实现物体右键旋转的功能,我们可以检测用户是否按下了右键。如果按下了右键,我们可以使用Input.GetAxis函数来获取鼠标在水平和垂直方向上的移动量。然后,我们可以将这些移动量应用到物体的旋转角度上,从而实现物体的旋转。 另外,要实现滑轮缩放的功能,我们可以检测用户是否滚动了滑轮。如果滚动了滑轮,我们可以使用Input.GetAxis函数来获取滑轮的滚动量。然后,我们可以将这个滚动量应用到物体的缩放比例上,从而实现物体的缩放。 以下是一个简单的示例代码,实现了物体的右键旋转和滑轮缩放功能: ``` using UnityEngine; public class ObjectRotation : MonoBehaviour { public float rotationSpeed = 10f; public float scaleSpeed = 0.1f; void Update() { // 获取鼠标右键输入 if (Input.GetMouseButton(1)) { // 获取鼠标的移动量 float mouseX = Input.GetAxis("Mouse X"); float mouseY = Input.GetAxis("Mouse Y"); // 应用移动量到物体的旋转角度 transform.Rotate(Vector3.up, -mouseX * rotationSpeed, Space.World); transform.Rotate(Vector3.right, mouseY * rotationSpeed, Space.World); } // 获取滑轮的滚动量 float scroll = Input.GetAxis("Mouse ScrollWheel"); // 应用滚动量到物体的缩放比例 Vector3 scale = transform.localScale + new Vector3(scroll, scroll, scroll) * scaleSpeed; transform.localScale = scale; } } ``` 将这个脚本添加到物体上后,在Unity中点击运行,你就可以使用鼠标右键旋转物体,并且使用滑轮缩放物体的大小了。注意,你可以根据需要调整rotationSpeed和scaleSpeed的值来控制旋转缩放的速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值