- Home /
smoothly change position of an Object
My goal is to make my character pickup a weapon smoothly, point being when I change the position: weapon.transform.position = weaponPos.position; it changes the position immediately, I tried to use:
weapon.transform.position = Vector3.Lerp(weapon.transform.position, weaponPos.transform.position, 10)
as well as
weapon.transform.position = Vector3.Lerp(weapon.transform.position, weaponPos.transform.position, 10 * Time.deltaTime) but it still doesnt work, what can I do? here is the whole code:
private void FixedUpdate()
{
IsLookingAtWeapon();
}
void IsLookingAtWeapon()
{
Ray ray = cam.ViewportPointToRay(new Vector3(0.5F, 0.5F, 0));
RaycastHit hit;
if (Physics.Raycast(ray, out hit, maxDistence1)
&& hit.collider.gameObject.CompareTag("Weapon"))
{
if (Input.GetKeyDown(KeyCode.E))
{
if (!HasWeapon)
{
weapon = hit.collider.gameObject;
weapon.transform.rotation = weaponPos.rotation;
weapon.transform.position = Vector3.Lerp(weapon.transform.position,
weaponPos.transform.position, 10);
weapon.transform.parent = weaponPos;
weapon.GetComponent<Rigidbody>().isKinematic = true;
weapon.GetComponent<BoxCollider>().isTrigger = true;
HasWeapon = true;
}
Answer by Jasr_88 · Jun 05, 2020 at 03:52 PM
Vector3.Lerp will wok only (as you want) if you put it on a loop (like the update loop or a corroutine)
try calling a coroutine like this:
IEnumerator SmoothTranlation(Vector3 target, float speed) {
while (weapon.transform.position != target)) {
weapon.transform.position = Vector3.Lerp (weapon.transform.position, target, Time.deltaTime * speed);
yield return null;
}
}
instead of this line :
weapon.transform.position = Vector3.Lerp(weapon.transform.position,weaponPos.transform.position, 10);
[EDIT]: oh thats right!, i'm sorry for that, you only need to use the "!=" operator
Hope it helps!
it shows that I cant convert vector3 to float, $$anonymous$$athf.Approximatley takes 2 floats not 2 vectors
Tnx man actually works!!! only one problem, when you pass the target vector3 it saves the position as it own var that cant change, that means the the weapon will come specifically to that point, that it means that it wont go the the weaponPos.transform.position it will go to the vector3 but it easily gets fixed just by passing transform Target ins$$anonymous$$d of Vector3 target
in other words thats the final solution:
IEnumerator SmoothTranlation(Transform target, float speed)
{
while (weapon.transform.position != target.position)
{
weapon.transform.position = Vector3.Lerp(weapon.transform.position, target.position, Time.deltaTime * speed);
yield return new WaitForEndOfFrame();
}
}
Your answer
Follow this Question
Related Questions
moving between two points over time 1 Answer
Object keeps moving when using Vector3.Lerp on transform.position 0 Answers
How to smooth my camera (Vector3.Lerp) 0 Answers
How would I smooth out a Quaternion? 2 Answers
trouble with smooth damping 0 Answers