如果你想做一个显眼的可拾取物体让玩家注意到
那么你能会考虑给物体加上旋转、浮动、发光效果
这次我们来看一看旋转和浮动效果如何实现吧!
效果展示
实现思路
如果你学过高中物理,那么你一定知道简谐运动。
是的,没错!浮动的纵坐标随着时间变化,反应在数值上就是一种简谐运动!
所以浮动的实现原理非常简单:设置一个运动的原点,然后物体绕着原点进行上下浮动,每次随着时间改变纵坐标。记录物体原本的位置,在此基础上使用Mathf.Sin()
函数,让物体上下浮动(类似为横波的简谐运动)
基础浮动效果
posOffset
为物体的初始位置,先记录下来
修改其y
即数值方向的坐标:tempPos.y += Mathf.Sin(...)
(Time.fixedTime * Mathf.PI * frequency)
和 amplitude
相当于频率(快慢)和幅度(强度)
额外旋转效果
transform.Rotate(new Vector3(0f, Time.deltaTime * degreesPerSecond, 0f), Space.World);
如果你学过一点其他高级语言,那么这里 transform
的意义很简明,它是一个类内成员,指向挂载脚本的游戏对象的 transform
组件,transform.Rotate()
即调用对象的成员函数。
内部的参数可以参考 Unity 官方 API
强烈推荐参考官网 API,虽然为英文,但非常简略,另每个 API 至少带有一个实例。
这里的参数表示的是绕着 Vector3 变量的轴旋转一定角度,即如果绕 X 轴旋转 30,那么 Vector3 变量的第一个值便为 30f(Unity 中大多按照度数旋转)。
new Vector()
表示一个未命名的变量,由于我们只需要用一次,所以不用命名也可,即匿名。
脚本编写
新建一个 C# Script,输入下面这段代码
using UnityEngine;
using System.Collections;
// Makes objects float up & down while gently spinning.
public class Floater : MonoBehaviour {
// User Inputs
public float degreesPerSecond = 15.0f;
public float amplitude = 0.5f;
public float frequency = 1f;
// Position Storage Variables
Vector3 posOffset = new Vector3 ();// 存放初始位置,即简谐运动的原点
Vector3 tempPos = new Vector3 ();// 存放现在运动到的位置
// Use this for initialization
void Start () {
// Store the starting position & rotation of the object
// 存放物体的起始位置,也即简谐运动的原点
posOffset = transform.position;
}
// Update is called once per frame
void Update () {
// Spin object around Y-Axis
// 将物体绕着 Y
transform.Rotate(new Vector3(0f, Time.deltaTime * degreesPerSecond, 0f), Space.World);
// Float up/down with a Sin()
tempPos = posOffset;
tempPos.y += Mathf.Sin (Time.fixedTime * Mathf.PI * frequency) * amplitude;// 只需要修改 y 坐标
transform.position = tempPos;// 修改物体的坐标
}
}