Unity And C
2022/10/18
-
3D Vectors
- Unity中采用左手坐标系 伸出左手食指向上代表Y轴,X和Z构成水平面
- 为计算向量大小提供了Vector3.magnitude函数
- 点积(Dot Product) Vector3.Dot(VectorA,VectorB)
- 叉积(Cross Product) Vector3.Cross(VectorA,VectorB)
-
启用和禁用组件
-
在运行时启用和禁用组件可以令CustomComp.enabled = true/false,也可以令CustomComp.enabled = !CustomComp.enabled 该表达式表示令组件切换至与当前状态相反的状态。如下即可实现按下空格键使开/关。
using UnityEngine; using System.Collections; public class EnableComponents : MonoBehaviour { private Light myLight; void Start () { myLight = GetComponent<Light>(); } void Update () { if(Input.GetKeyUp(KeyCode.Space)) { myLight.enabled = !myLight.enabled; } } }
-
-
激活游戏对象
-
使用gameObject.SetActive(true/false)可以激活/停用该游戏对象
-
gameObject.activeSelf 当前游戏对象状态
-
gameObject.activeInHierarchy 当前游戏对象在层级视图中的状态
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Learn : MonoBehaviour { public GameObject myObject; // Start is called before the first frame update void Start() { myObject.SetActive(false); Debug.Log("Active Self: " + myObject.activeSelf); Debug.Log("Active in Hierarchy: " + myObject.activeInHierarchy); }
运行结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KKYWZnpI-1666098317651)(C:\Users\17861\AppData\Roaming\Typora\typora-user-images\image-20221018190603530.png)]
如果停用该对象的父物体,那么该父物体及其所有子物体都会停用,但子物体仍在其层级结构中保持活跃状态;即Active Self为true,但Active In Hierarchy为false。
-
-
Translate And Rotate
-
Translate 平移 Rotate 旋转
using UnityEngine; using System.Collections; public class TransformFunctions : MonoBehaviour { public float moveSpeed = 10f; public float turnSpeed = 50f; void Update () { if(Input.GetKey(KeyCode.UpArrow)) transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime); if(Input.GetKey(KeyCode.DownArrow)) transform.Translate(-Vector3.forward * moveSpeed * Time.deltaTime); if(Input.GetKey(KeyCode.LeftArrow)) transform.Rotate(Vector3.up, -turnSpeed * Time.deltaTime); if(Input.GetKey(KeyCode.RightArrow)) transform.Rotate(Vector3.up, turnSpeed * Time.deltaTime); } }
应当注意到,这些函数作用于局部轴而非世界轴,因此使用Vector3.forward或Vector3.up时,相对的是脚本所应用到的的游戏对象的轴,适用于更改非刚体对象的位置和旋转;如果想用碰撞体移动某个对象,也就是将会产生物理作用的物体,则不应使用Translate和Rotate函数,而是应该考虑使用Physics函数。
-
-
Look At
-
使用LookAt函数可使一个游戏对象的变换组件面向另一个游戏对象的变换组件
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraLookAt : MonoBehaviour { public Transform target; void Update() { transform.LookAt(target); } }
将CameraLookAt.cs挂载到Main Camera上,将Cube指定为target,即可实现令相机持续看向Cube。
-
-
线性插值
-
在制作游戏时,有时可以在两个值之间进行线性插值。这是通过 Lerp 函数来完成的。线性插值会在两个给定值之间找到某个百分比的值。例如,我们可以在数字 3 和 5 之间按 50% 进行线性插值以得到数字 4。这是因为 4 是 3 和 5 之间距离的 50%。
在 Unity 中,有多个 Lerp 函数可用于不同类型。对于我们刚才使用的示例,与之等效的将是 Mathf.Lerp 函数,如下所示:
// 在此示例中,result = 4 float result = Mathf.Lerp (3f, 5f, 0.5f);
Mathf.Lerp 函数接受 3 个 float 参数:一个 float 参数表示要进行插值的起始值,另一个 float 参数表示要进行插值的结束值,最后一个 float 参数表示要进行插值的距离。在此示例中,插值为 0.5,表示 50%。如果为 0,则函数将返回“from”值;如果为 1,则函数将返回“to”值。
-
Lerp 函数的其他示例包括 Color.Lerp 和 Vector3.Lerp。这些函数的工作方式与 Mathf.Lerp 完全相同,但是“from”和“to”值分别为 Color 和 Vector3 类型。在每个示例中,第三个参数仍然是一个 float 参数,表示要插值的大小。这些函数的结果是找到一种颜色(两种给定颜色的某种混合)以及一个矢量(占两个给定矢量之间的百分比)。
让我们看看另一个示例:
Vector3 from = new Vector3 (1f, 2f, 3f); Vector3 to = new Vector3 (5f, 6f, 7f); // 此处 result = (4, 5, 6) Vector3 result = Vector3.Lerp (from, to, 0.75f);
在此示例中,结果为 (4, 5, 6),因为 4 位于 1 到 5 之间的 75% 处,5 位于 2 到 6 之间的 75% 处,而 6 位于 3 到 7 之间的 75% 处。
使用 Color.Lerp 时适用同样的原理。在 Color 结构中,颜色由代表红色、蓝色、绿色和 Alpha 的 4 个 float 参数表示。使用 Lerp 时,与 Mathf.Lerp 和 Vector3.Lerp 一样,这些 float 数值将进行插值。
-
在某些情况下,可使用 Lerp 函数使值随时间平滑。请考虑以下代码段:
void Update () { light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f); }
如果光的强度从 0 开始,则在第一次更新后,其值将设置为 4。下一帧会将其设置为 6,然后设置为 7,再然后设置为 7.5,依此类推。因此,经过几帧后,光强度将趋向于 8,但随着接近目标,其变化速率将减慢。请注意,这是在若干个帧的过程中发生的。如果我们不希望与帧率有关,则可以使用以下代码:
void Update () { light.intensity = Mathf.Lerp(light.intensity, 8f, 0.5f * Time.deltaTime); }
这意味着强度变化将按每秒而不是每帧发生。
请注意,在对值进行平滑时,通常情况下最好使用 SmoothDamp 函数。仅当您确定想要的效果时,才应使用 Lerp 进行平滑。
-