unity 相机 smooth/easing 拖动
Unity camera smooth/easing drag
我试图在拖动相机时进行缓动或惯性处理,因此当我放下相机时它会缓和到位。我想根据力 throw/drag 移动相机。
这是我用来拖动相机的实际代码,但其中没有平滑的缓动。
using UnityEngine;
using System.Collections;
public class swipeCamera: MonoBehaviour
{
Vector3 hit_position = Vector3.zero;
Vector3 current_position = Vector3.zero;
Vector3 camera_position = Vector3.zero;
float z = 0.0f;
// Use this for initialization
void Start()
{
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
hit_position = Input.mousePosition;
camera_position = transform.position;
}
if (Input.GetMouseButton(0))
{
current_position = Input.mousePosition;
LeftMouseDrag();
}
}
void LeftMouseDrag()
{
// From the Unity3D docs: "The z position is in world units from the camera." In my case I'm using the y-axis as height
// with my camera facing back down the y-axis. You can ignore this when the camera is orthograhic.
current_position.z = hit_position.z = camera_position.y;
// Get direction of movement. (Note: Don't normalize, the magnitude of change is going to be Vector3.Distance(current_position-hit_position)
// anyways.
Vector3 direction = Camera.main.ScreenToWorldPoint(current_position) - Camera.main.ScreenToWorldPoint(hit_position);
// Invert direction to that terrain appears to move with the mouse.
direction = direction * -1;
Vector3 position = camera_position + direction;
transform.position = position;
}
}
谢谢!
缓和意味着随着时间的推移逐渐移动。
所以这种行为通常是在Update
方法中用Vector.MoveTowards
or other lerp functions and Time.deltaTime实现的。
using UnityEngine;
using System.Collections;
public class swipeCamera: MonoBehaviour
{
public float speed = 2.0f;//easing speed
Vector3 hit_position = Vector3.zero;
Vector3 current_position = Vector3.zero;
Vector3 camera_position = Vector3.zero;
float z = 0.0f;
bool flag = false;
Vector3 target_position;
void Start()
{
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
hit_position = Input.mousePosition;
camera_position = transform.position;
}
if (Input.GetMouseButton(0))
{
current_position = Input.mousePosition;
LeftMouseDrag();
flag = true;
}
if(flag)
{
transform.position = Vector3.MoveTowards(transform.position, target_position, Time.deltaTime*speed);
if(transform.position == target_position)//reached?
{
flag = false;// stop moving
}
}
}
void LeftMouseDrag()
{
// From the Unity3D docs: "The z position is in world units from the camera." In my case I'm using the y-axis as height
// with my camera facing back down the y-axis. You can ignore this when the camera is orthograhic.
current_position.z = hit_position.z = camera_position.y;
// Get direction of movement. (Note: Don't normalize, the magnitude of change is going to be Vector3.Distance(current_position-hit_position)
// anyways.
Vector3 direction = Camera.main.ScreenToWorldPoint(current_position) - Camera.main.ScreenToWorldPoint(hit_position);
// Invert direction to that terrain appears to move with the mouse.
direction = direction * -1;
target_position = camera_position + direction;
}
}
我试图在拖动相机时进行缓动或惯性处理,因此当我放下相机时它会缓和到位。我想根据力 throw/drag 移动相机。
这是我用来拖动相机的实际代码,但其中没有平滑的缓动。
using UnityEngine;
using System.Collections;
public class swipeCamera: MonoBehaviour
{
Vector3 hit_position = Vector3.zero;
Vector3 current_position = Vector3.zero;
Vector3 camera_position = Vector3.zero;
float z = 0.0f;
// Use this for initialization
void Start()
{
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
hit_position = Input.mousePosition;
camera_position = transform.position;
}
if (Input.GetMouseButton(0))
{
current_position = Input.mousePosition;
LeftMouseDrag();
}
}
void LeftMouseDrag()
{
// From the Unity3D docs: "The z position is in world units from the camera." In my case I'm using the y-axis as height
// with my camera facing back down the y-axis. You can ignore this when the camera is orthograhic.
current_position.z = hit_position.z = camera_position.y;
// Get direction of movement. (Note: Don't normalize, the magnitude of change is going to be Vector3.Distance(current_position-hit_position)
// anyways.
Vector3 direction = Camera.main.ScreenToWorldPoint(current_position) - Camera.main.ScreenToWorldPoint(hit_position);
// Invert direction to that terrain appears to move with the mouse.
direction = direction * -1;
Vector3 position = camera_position + direction;
transform.position = position;
}
}
谢谢!
缓和意味着随着时间的推移逐渐移动。
所以这种行为通常是在Update
方法中用Vector.MoveTowards
or other lerp functions and Time.deltaTime实现的。
using UnityEngine;
using System.Collections;
public class swipeCamera: MonoBehaviour
{
public float speed = 2.0f;//easing speed
Vector3 hit_position = Vector3.zero;
Vector3 current_position = Vector3.zero;
Vector3 camera_position = Vector3.zero;
float z = 0.0f;
bool flag = false;
Vector3 target_position;
void Start()
{
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
hit_position = Input.mousePosition;
camera_position = transform.position;
}
if (Input.GetMouseButton(0))
{
current_position = Input.mousePosition;
LeftMouseDrag();
flag = true;
}
if(flag)
{
transform.position = Vector3.MoveTowards(transform.position, target_position, Time.deltaTime*speed);
if(transform.position == target_position)//reached?
{
flag = false;// stop moving
}
}
}
void LeftMouseDrag()
{
// From the Unity3D docs: "The z position is in world units from the camera." In my case I'm using the y-axis as height
// with my camera facing back down the y-axis. You can ignore this when the camera is orthograhic.
current_position.z = hit_position.z = camera_position.y;
// Get direction of movement. (Note: Don't normalize, the magnitude of change is going to be Vector3.Distance(current_position-hit_position)
// anyways.
Vector3 direction = Camera.main.ScreenToWorldPoint(current_position) - Camera.main.ScreenToWorldPoint(hit_position);
// Invert direction to that terrain appears to move with the mouse.
direction = direction * -1;
target_position = camera_position + direction;
}
}