当鼠标拖动时游戏评测,执行对象旋转功能。 当鼠标位置没有变化时,不执行对象旋转功能。 也就是说,当鼠标按下时,还需要额外一层判断来判断当前鼠标位置是否发生了移动。 如果有的话,证明当前物体正在旋转。 如果不能证明是当前角度查看的对象游戏运营,基于这个思想,完整的代码如下:
Vector3 v3;
bool isRotate;
Vector2 beforMousePos;
Vector2 currentMousePos;
public void Start()
{
beforMousePos = Input.mousePosition;
currentMousePos = Input.mousePosition;
}
private void OnMouseDrag()
{
isRotate = true;
v3 = new Vector3(Time.deltaTime * 200 * Input.GetAxis("Mouse Y"), -Time.deltaTime * 200 * Input.GetAxis("Mouse X"), RobotDemoModel.Robot.transform.rotation.z);
}
private void OnMouseUp()
{
isRotate = false;
}
private void Update()
{
currentMousePos = Input.mousePosition;
if (Vector2.Distance(currentMousePos,beforMousePos)>10.0f)
{
beforMousePos = currentMousePos;
//print("Mouse Move");
if (isRotate)
{
RobotDemoModel.Robot.transform.Rotate(v3, Space.World);
}
}
//print("Mouse Stop");
}
超过!
开发时使用上面的脚本时,发现基本的要求都满足了,但是还是有一些不太舒服的地方。 如果继续旋转就会感觉不舒服。 简单来说,旋转很容易,但是如果想继续旋转,原来的样子和位置就会很不舒服unity 旋转物体,所以,要改变想法,不如直接把物体旋转到相机上unity 旋转物体,让相机围绕物体旋转。 这执行起来会更舒服。 话不多说,代码如下:
float mouse_x = Input.GetAxis("Mouse X");
float mouse_y = Input.GetAxis("Mouse Y");
//核心脚本是下面这两句
//围绕旋转的话和Z轴是无关的,只是围绕物体的X和Y轴进行旋转所以
//这里有个小点,围绕物体左右旋转使用的是Vector3.up,但是上下旋转使用的是transform.
//right,也就是摄像机本身的左右。这样的旋转效果比较好
transform.RotateAround(tarObj.transform.position,Vector3.up,mouse_x * speed);
transform.RotateAround(tarObj.transform.position,transform.right,mouse_y * speed);
//这个是移动摄像机位置,也就是视角的变换
//因为这个移动和z轴也没有关系,所以选定的就是Up和Left,这里要使用Vector3,用transform的话移动起来就是根据摄像机的XY移动并不是屏幕的XY
transform.Translate(Vector3.left * (mouse_x * moveSpeed) * Time.deltaTime);
transform.Translate(Vector3.up * (mouse_y * moveSpeed) * Time.deltaTime);
//这个就是摄像机的缩放了
//Mouse ScrollWheel的取值范围是在+0.3f - -0.3f之间
if(Input.GetAxis("Mouse ScrollWheel") > 0)
transform.Translate(Vector3.forward * scrollSpeed);
if(Input.GetAxis("Mouse ScrollWheel") < 0)
transform.Translate(Vector3.forward * -scrollSpeed);
超过!
文章来源:https://blog.csdn.net/qq_38186269/article/details/88741965