- Home /
Rotate within range
Hi everyone, I'm making a multiplayer 2D CirclePong game in Unity and have ran into an issue involving the racket.
I want the paddle/racket to only be able to in rotate in its area (top or bottom side of circle) only, and stop rotating if it hits the dotted line. With the code right now, the paddle can freely rotate everywhere. I initially tried using a 2d box collider on the dotted line but got weird behavior interacting with the paddle/racket.
Please see the image to better understand the idea.
Here is my code for the racket right now, it uses transform.RotateAround with the circle background as the target, around z axis, and 3 degree/second.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ControlRacket : MonoBehaviour
{
public float speed;
public Transform target;
private Vector3 zAxis = new Vector3(0, 0, 1);
void FixedUpdate()
{
float player1Movement = Input.GetAxisRaw("Horizontal");
// Move left side
if (player1Movement <= 0f)
{
this.transform.RotateAround(target.position, zAxis, -speed);
}
// Move right side
if (player1Movement >= 0f)
{
this.transform.RotateAround(target.position, zAxis, speed);
}
}
}
Answer by Namey5 · Jul 31, 2020 at 10:08 AM
Something like this should work;
[SerializeField] private bool invertAxis = false;
private Vector3 start = Vector3.zero;
private float currentAngle = 0f;
void FixedUpdate ()
{
//Get the initial vector from our position to the target
if (start == Vector3.zero)
start = target.position - transform.position;
//Control our current angle and clamp it to 90 degrees either side
currentAngle = Mathf.Clamp (currentAngle + speed * Input.GetAxisRaw ("Horizontal") * (invertAxis ? -1f : 1f), -90f, 90f);
//Find the new rotation relative to our starting vector
Quaternion rot = Quaternion.AngleAxis (currentAngle, Vector3.forward);
//Assign the new rotation
transform.rotation = rot;
//Move our position away from the target using distance info from start
transform.position = target.position - rot * Quaternion.LookRotation (start) * Vector3.forward * start.magnitude;
}
Thank you! This was exactly what I was looking for!