C# And Unity学习笔记

FuckingWorld
摘要由CSDN通过智能技术生成

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 进行平滑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值