How To Make A 3D Analog Clock (Unity Tutorial)

Опубликовано: 02 Август 2026
на канале: PingSharp
2,108
44

How to program a clock in Unity3D.
Code for the clock:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Clock : MonoBehaviour
{
[SerializeField]
private GameObject secondsHandle, minutesHandle, hoursHandle;
private float secondsMultiplier = 1f;
private int inGameSeconds;
private int timeAtStart = 10000;

void Update()
{
inGameSeconds = Mathf.RoundToInt(Time.time * secondsMultiplier) + timeAtStart;
secondsHandle.transform.localRotation = Quaternion.Euler(0, inGameSeconds * 360 / 60, 0);
minutesHandle.transform.localRotation = Quaternion.Euler(0, inGameSeconds * 360 / 3600, 0);
hoursHandle.transform.localRotation = Quaternion.Euler(0, inGameSeconds * 360 / 43200, 0);
}
}
Code for clock indicator position & rotation:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ClockIndicators : MonoBehaviour
{
[SerializeField]
private GameObject indicPrefab, smallIndicPrefab, clock;
private float indicOffset = 2.3f;
private float smallIndicOffset = 2.3f;
private void Start()
{
indicOffset = (clock.transform.localScale.x / 2 - indicPrefab.transform.localScale.y / 2 * clock.transform.localScale.x) * 0.9f;
smallIndicOffset = (clock.transform.localScale.x / 2 - smallIndicPrefab.transform.localScale.y / 2 * clock.transform.localScale.x) * 0.9f;
float angle;
for(int i = 0; i isSmallerThan 60; i++)//Cannot use the sign in the description
{
angle = 6 * i;
GameObject indicator;
if(angle % 30 == 0)
{
indicator = Instantiate(indicPrefab, indicPrefab.transform.position, Quaternion.identity, transform);
indicator.transform.localPosition = new Vector3(Mathf.Sin(angle * Mathf.Deg2Rad), 0, Mathf.Cos(angle * Mathf.Deg2Rad)) * indicOffset;
}
else
{
indicator = Instantiate(smallIndicPrefab, smallIndicPrefab.transform.position, Quaternion.identity, transform);
indicator.transform.localPosition = new Vector3(Mathf.Sin(angle * Mathf.Deg2Rad), 0, Mathf.Cos(angle * Mathf.Deg2Rad)) * smallIndicOffset;
}
indicator.transform.localRotation = Quaternion.Euler(0, angle, 0);
}
}
}