作业二

快速导览

作业需求

使用套件档案、事前作业

点击下载 clock.unitypackage

使用 Unity 版本:2019.3.7f1

※点击图片可以放大

※脚本名称都可以随个人喜好修改

(0) (1) 基本时钟加上 Find 参考物件

开启一个新专案 (3D专案)

选择「资源」→「汇入套件」→「自订套件」

选择文章开头下载的「clock.unitypackage」

使用预设勾选项,按下「汇入」

已成功汇入

选择「Assets」→「Clock」→「Prefabs」
底下的「Clock.prefab」拖曳到阶层视窗

再来对着我们刚刚拖曳进去的 Clock.prefab 按下右键
选择「拆解 prefab」

接着对「Clcok」这个物件设定属性

设定完成,按著 Alt 键可以拖拉看看效果

至此,物件设定结束,再来新增脚本的部分
下方资源浏览器按下右键「建立」→「资料夹」

输入名称「Scripts」用以存放脚本档案

进入资料夹内,按下右键「建立」→「C# 脚本」命名为 「Clock」

点两下 Clock 档案,进入 Visual Studio 编辑脚本
首先,先在开头处将以下程式片段加入

using System;

将以下程式片段新增至 Start() 与 Update() 外

private const float hourstode = 360f / 12f,
        minutetode = 360f / 60f,
        secondtode = 360f / 60f;
private Transform hours, minutes, seconds;
public bool analog;

请将以下程式片段新增至 void Start() 内

hours = GameObject.Find("HourHand").transform;
minutes = GameObject.Find("MinuteHand").transform;
seconds = GameObject.Find("SecondHand").transform;

请将以下程式片段新增至 void Update() 内

if (analog)
{
  TimeSpan timespan = DateTime.Now.TimeOfDay;
  hours.localRotation = Quaternion.Euler(0f, 0f, (float)timespan.TotalHours * hourstode);
  minutes.localRotation = Quaternion.Euler(0f, 0f, (float)timespan.TotalMinutes * minutetode);
  seconds.localRotation = Quaternion.Euler(0f, 0f, (float)timespan.TotalSeconds * secondtode);
}
else
{
  DateTime time = DateTime.Now;
  hours.localRotation = Quaternion.Euler(0f, 0f, time.Hour * hourstode);
  minutes.localRotation = Quaternion.Euler(0f, 0f, time.Minute * minutetode);
  seconds.localRotation = Quaternion.Euler(0f, 0f, time.Second * secondtode);
}

编辑完成后按下 Ctrl + S 储存脚本档案

(2) 加入脚本让时钟印出距离最近的物件

一样在 Scripts 资料夹里面新增一个 C# 脚本,名称「Near」
点击两下进入 Visual Studio 编辑他

请将以下程式片段新增至 void Start() 内

float closestDistance = Mathf.Infinity;
GameObject closestGameObject = null;
GameObject[] allObjects = (GameObject[])GameObject.FindSceneObjectsOfType(typeof(GameObject));
foreach (GameObject g in allObjects)
{
  if (g.name != name)
  {
    float distance = (g.transform.position - transform.position).sqrMagnitude;
    if (distance < closestDistance)
    {
      closestDistance = distance;
      closestGameObject = g;
    }
  }
}
Debug.Log($"最靠近的物件是: {closestGameObject}, 距离是: {closestDistance}");

编辑完成后按下 Ctrl + S 储存脚本档案

(3) 透过滑鼠移动来上下左右观看时钟

一样在 Scripts 资料夹里面新增一个 C# 脚本,名称「MouseLook」
点击两下进入 Visual Studio 编辑他

将以下程式片段新增至 Start() 与 Update() 外

public enum RotationAxes { MouseXANDY = 0, MouseX = 1, MouseY = 2 }
public RotationAxes axes = RotationAxes.MouseXANDY;
public float sensitivityHor = 9.0f;
public float sensitivityVert = 9.0f;
public float minVert = -45.0f;
public float maxVert = 45.0f;
private float _rotationX = 0;

请将以下程式片段新增至 void Start() 内

Rigidbody body = GetComponent<Rigidbody>();
if (body != null)
    body.freezeRotation = true;

请将以下程式片段新增至 void Update() 内

if (axes == RotationAxes.MouseX)
    transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityHor, 0);
else if (axes == RotationAxes.MouseY)
{
    _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
    _rotationX = Mathf.Clamp(_rotationX, minVert, maxVert);
    float rotationY = transform.localEulerAngles.y;
    transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
}
else
{
    _rotationX -= Input.GetAxis("Mouse Y") * sensitivityVert;
    _rotationX = Mathf.Clamp(_rotationX, minVert, maxVert);
    float delta = Input.GetAxis("Mouse X") * sensitivityHor;
    float rotationY = transform.localEulerAngles.y - delta;
    transform.localEulerAngles = new Vector3(_rotationX, rotationY, 0);
}

编辑完成后按下 Ctrl + S 储存脚本档案

将「Clock」「Near」「MouseLook」三个脚本拖曳至「Clock」物件上

作业完成,看看效果吧!

SHXJ
Latest posts by SHXJ (see all)

发布留言