- Home /
Question by
ShadowAngel · Aug 18, 2012 at 06:09 PM ·
rotationturretarc
Fireing arc
I have a simple turret rotation script.
function TurretRotation()
{
var CurnetRotation : Quaternion;
var targetRotation : Quaternion;
if (Target == null || ThisAiActor.Target.GetComponent(Stats) == null || ThisAiActor.Target.tag == ThisGameObject.tag)
{
CurnetRotation = Quaternion.RotateTowards(transform.localRotation, StartingRotation, TurnSpeed * Time.deltaTime);
if (CurnetRotation != transform.localRotation)
transform.localRotation = CurnetRotation;
}
else
{
targetRotation = Quaternion.LookRotation(ThisAiActor.Target.transform.position - transform.position);
CurnetRotation = Quaternion.RotateTowards(transform.rotation, targetRotation, TurnSpeed * Time.deltaTime);
if (CurnetRotation != transform.rotation)
transform.rotation = CurnetRotation;
}
}
I need to clamp rotation on +45F and -45F from local rotation. Turret is a child of a ship. So basicly i need to make fireing arc for my tuuret.
Iv tryd to use
function ClampAngle (angle : float, min : float, max : float)
{
if (angle < -360F)
angle += 360F;
if (angle > 360F)
angle -= 360F;
return Mathf.Clamp (angle, min, max);
}
on transform.rotation but its just ruins all rotation. I know i need to use it on local rotation, but how do i do it?
Comment
Where are you calling ClampAngle from? I don't see it anywhere in your code.
Answer by ShadowAngel · Aug 19, 2012 at 01:26 PM
K did it my self
function TurretRotation()
{
var ThisFrameRotation : Quaternion;
var CurnetLocalRotation : Quaternion;
var TargetLocalRotation : Quaternion;
var targetRotation : Quaternion;
var tooFar : boolean;
if (ThisAiActor.Target != null)// If target is not null, then start checking
{
CurnetLocalRotation = transform.localRotation; // Save currnet frame local rotation
targetRotation = Quaternion.LookRotation(ThisAiActor.Target.transform.position - transform.position); // Get target rotation
transform.rotation = targetRotation; // Rotate turret to face a target
TargetLocalRotation = transform.localRotation; // Save local rotation after turret has faced target
transform.localRotation = CurnetLocalRotation; // Turn turret back to original position for this frame
tooFar = LogicClampAngle(TargetLocalRotation, StartingRotation, MinimumX, MaximumX, MinimumY, MaximumY, MinimumZ, MaximumZ); // Start check
}
if (ThisAiActor.Target.GetComponent(Stats) != null && ThisAiActor.Target.tag != ThisGameObject.tag && !tooFar) // Check if turret should start turning
ThisFrameRotation = Quaternion.RotateTowards(transform.localRotation, TargetLocalRotation, TurnSpeed * Time.deltaTime); // Get this frame rotation to target
else // If turret should not turn get it back to starting rotation
ThisFrameRotation = Quaternion.RotateTowards(transform.localRotation, StartingRotation, TurnSpeed * Time.deltaTime); // Get this frame rotation to starting rotation
if (ThisFrameRotation != transform.localRotation) // Check for good`ol unity bug with NaN
transform.localRotation = ThisFrameRotation; // Finaly rotate turret
}
function LogicClampAngle (TargetAngle : Quaternion, StartingAngle : Quaternion, MinX : float, MaxX : float, MinY : float, MaxY : float, MinZ : float, MaxZ : float) : boolean
{
var TooFar : boolean = false;
var angle_X_delta = Mathf.DeltaAngle(TargetAngle.eulerAngles.x, StartingAngle.eulerAngles.x);
var angle_Y_delta = Mathf.DeltaAngle(TargetAngle.eulerAngles.y, StartingAngle.eulerAngles.y);
var angle_Z_delta = Mathf.DeltaAngle(TargetAngle.eulerAngles.z, StartingAngle.eulerAngles.z);
if (angle_X_delta > 0 && angle_X_delta > MaxX)
TooFar = true;
else if (angle_X_delta < 0 && angle_X_delta < MinX)
TooFar = true;
if (angle_Y_delta > 0 && angle_Y_delta > MaxY)
TooFar = true;
else if (angle_Y_delta < 0 && angle_Y_delta < MinY)
TooFar = true;
if (angle_Z_delta > 0 && angle_Z_delta > MaxZ)
TooFar = true;
else if (angle_Z_delta < 0 && angle_Z_delta < MinZ)
TooFar = true;
return TooFar;
}
Min limit have to be some thing like -10 or -160. Max limit have to be some thing like 10 or 160.
Your answer
![](https://koobas.hobune.stream/wayback/20220613075843im_/https://answers.unity.com/themes/thub/images/avi.jpg)