初识Unity 编辑器的基本使用 在游戏场景当中,长按右键拖移可以以当前点为圆心进行视角转动,长按鼠标滚轮可以进行位置的移动。
C#脚本 生命周期函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 using System.Collections;using System.Collections.Generic;using UnityEngine;public class Move : MonoBehaviour { private void Awake () { } private void OnEnable () { } void Start () { } void Update () { } private void LateUpdate () { } private void FixedUpdate () { } private void OnDisable () { } private void OnDestroy () { } }
向量的使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 void Start (){ Vector3 v = new Vector3(); v = Vector3.zero; v = Vector3.right; Vector3 v2 = Vector3.forward; Debug.Log("这两个向量之间的夹角是" + Vector3.Angle(v, v2)); Debug.Log("这两点之间距离是" + Vector3.Distance(v, v2)); Debug.Log("两个向量的点乘是" + Vector3.Dot(v, v2)); Debug.Log("两个向量的叉乘是" + Vector3.Cross(v, v2)); Debug.Log(Vector3.Lerp(Vector3.zero, Vector3.one, 0.8f )); Debug.Log(v.magnitude); Debug.Log(v.normalized); Vector3 v = new Vector3(0 , 30 , 0 ); Quaternion q = Quaternion.identity; q = Quaternion.Euler(v); v = q.eulerAngles; q = Quaternion.LookRotation(new Vector3(0 , 0 , 0 )); }
物体类的使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 using System.Collections;using System.Collections.Generic;using UnityEngine;public class Move : MonoBehaviour { public GameObject cube; public GameObject prefab; void Start () { Debug.Log("" ); Debug.LogWarning("" ); Debug.LogError("" ); Debug.Log("当前自身的激活状态:" + cube.activeSelf); Debug.Log("相对于世界的激活状态:" + cube.activeInHierarchy); cube.SetActive(false ); Transform transform = this .transform; Debug.Log(transform.position); BoxCollider collider = GetComponent<BoxCollider>(); GetComponentInChildren<Collider>(collider); GetComponentInParent<Collider>(collider); cube.AddComponent<AudioSource>(); GameObject test = GameObject.Find("Test" ); test = GameObject.FindGameObjectWithTag("Enemy" ); Instantiate(prefab, transform); Destroy(test); } void Update () { Debug.DrawLine(Vector3.zero, Vector3.one); Debug.DrawRay(Vector3.zero, Vector3.up); } }
游戏时间的使用 1 2 3 4 5 6 7 8 9 10 11 void Start (){ Debug.Log(Time.time); Debug.Log(Time.timeScale); Debug.Log(Time.fixedDeltaTime); Debug.Log(Time.deltaTime); }
Application类的使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 void Start (){ Debug.Log(Application.dataPath); Debug.Log(Application.dataPath + "/script/ApplicationTest.cs" ); Debug.Log(Application.persistentDataPath); Debug.Log(Application.streamingAssetsPath); Debug.Log(Application.temporaryCachePath); Debug.Log(Application.runInBackground); Application.OpenURL("www.baidu.com" ); Application.Quit(); }
游戏场景 如果想要在场景之间进行切换,首先需要在场景构建的设置中将这些场景都添加进来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 void Start (){ SceneManager.LoadScene(1 ); SceneManager.LoadScene("MyScene" ); Scene scene = SceneManager.GetActiveScene(); Debug.Log(scene.name); Debug.Log(scene.isLoaded); Debug.Log(scene.path); Debug.Log(scene.buildIndex); GameObject[] gameObjArr = scene.GetRootGameObjects(); Debug.Log(gameObjArr.Length); Debug.Log(SceneManager.sceneCount); Scene newScene = SceneManager.CreateScene("newScene" ); SceneManager.UnloadSceneAsync(newScene); SceneManager.LoadScene("MyScene" , LoadSceneMode.Additive); SceneManager.LoadSceneAsync("MyScene" , LoadSceneMode.Additive); }
加载场景,场景跳转 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.SceneManagement;public class AsyncTest : MonoBehaviour { AsyncOperation operation; void Start () { StartCoroutine(loadScene()); } IEnumerator loadScene () { operation = SceneManager.LoadSceneAsync(1 ); operation.allowSceneActivation = false ; yield return operation; } float timer = 0 ; void Update () { Debug.Log(operation.progress); timer += Time.deltaTime; if (timer > 5 ) { operation.allowSceneActivation = true ; } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 using System.Collections;using System.Collections.Generic;using UnityEngine;public class TransformTest : MonoBehaviour { void Start () { Debug.Log(transform.position); Debug.Log(transform.localPosition); Debug.Log(transform.rotation); Debug.Log(transform.localRotation); Debug.Log(transform.eulerAngles); Debug.Log(transform.localEulerAngles); Debug.Log(transform.localScale); Debug.Log(transform.forward); Debug.Log(transform.right); Debug.Log(transform.up); } void Update () { transform.LookAt(Vector3.zero); transform.Rotate(Vector3.up, 1 ); transform.RotateAround(Vector3.zero, Vector3.up, 1 ); transform.Translate(Vector3.forward * 0.1f ); } }
节点的父子级关系 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 void Start (){ Debug.Log(transform.parent.gameObject); Debug.Log(transform.childCount); transform.DetachChildren(); Transform tran = transform.Find("child" ); tran = transform.GetChild(0 ); bool res = tran.IsChildOf(transform); tran.SetParent(transform); }
键盘鼠标事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 void Update (){ if (Input.GetMouseButtonDown(0 )) { Debug.Log("鼠标左键点击了" ); } if (Input.GetMouseButton(0 )) { Debug.Log("持续按下鼠标左键" ); } if (Input.GetMouseButtonUp(0 )) { Debug.Log("抬起了鼠标左键" ); } if (Input.GetKeyDown(KeyCode.A)) { Debug.Log("按下了A键" ); } if (Input.GetKey(KeyCode.B)) { Debug.Log("持续按下了B键" ); } if (Input.GetKeyUp(KeyCode.A)) { Debug.Log("A键抬起了" ); }
虚拟轴和虚拟按键 虚拟轴就是一个在数值1-1之间的一个数轴,这个数轴上最重要的数值就是0,1,-1。当使用按键模拟一个完整的虚拟轴时需要用到两个按键,即将按键1设置为负轴按键,按键2设置为正轴按键。在没有按下任意键的时候,虚拟轴的数值为0,在按下按键1的时候,虚拟轴的数值会从0-1过渡;在按下按键2的时候,虚拟轴的值会从0~1进行过渡。
虚拟轴的作用主要是为解决了不同设备之间的操作兼容性问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 void Update (){ float horizontal = Input.GetAxis("Horizontal" ); float vertical = Input.GetAxis("Vertical" ); if (Input.GetButtonDown("Jump" )) { Debug.Log("空格" ); } if (Input.GetButtonUp("Jump" )) { Debug.Log("空格键抬起了" ); } if (Input.GetButton("Jump" )) { Debug.Log("空格键被长按了" ); } }
触摸方法的使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 using System.Collections;using System.Collections.Generic;using UnityEngine;public class TouchTest : MonoBehaviour { void Start () { Input.multiTouchEnabled = true ; } void Update () { if (Input.touchCount == 1 ) { Touch touch = Input.touches[0 ]; Debug.Log(touch.position); switch (touch.phase) { case TouchPhase.Began: break ; case TouchPhase.Moved: break ; case TouchPhase.Stationary: break ; case TouchPhase.Ended: break ; case TouchPhase.Canceled: break ; } } else if (Input.touchCount == 2 ) { } } }
场景灯光的使用 Light灯光组件属性:
Type:灯光类型。共有三种类型的灯光。
场景自带的灯光组件默认为定向光(Directional),可以像太阳一样,模拟从无穷远处打来的平行光。当组件为此属性时,移动灯光组件的位置不会产生影响,只有此节点发生旋转之后,才会产生影响(像太阳东升西落一样,地面影子的变化)。
聚光(Spot),类似于一个手电筒。
点光源(Point),类似于一个灯泡。
区域(Area),是以一个平面发射的平行光。
Color:发射出的灯光的颜色。
Mode:
实时(Realtime),实时渲染光源的照射情况,比较耗费性能。
混合(Mixed),处于实时和烘焙之间。
烘焙(Baked),把当前的灯光信息保存下来,之后不再进行阴影计算,就算是将光源删除或者取消激活,光源也会依旧存在在场景当中。
Intensity:灯光强度。
Indirect Multiplier:
Shadow Type:阴影类型。
默认为软阴影(Soft Shadows),边缘会被处理的羽化(比较消耗系统性能)。
硬阴影(Hard Shadow),阴影的边缘为锯齿状。
无阴影(No Shadows)。
Draw Halo:绘制光晕。
Culling Mask:剔除遮罩。将所在分组的节点去掉光照的影响,默认为全部(Everything)都会接收到光照。
灯光烘焙步骤:
1.先给需要灯光烘焙的节点勾选分组。
2.在弹出的提示框选择同步到子节点。
3.打开光照选项卡。
4.点击选项卡右下方的Generate Lighting(生成照明),等待渲染完成就可以了。
摄像机 投影(Projection):摄像机的类型。
清除标志(Clear Falg):相机拍摄不到的区域的样式
天空盒(Skybox),可以直接改变天空的材质、样式等,但是不会在场景中显示。
纯色(Solid Color)。
仅深度(Depth Only),常用于多个相机拍摄进行叠加。例如,其中一个摄像机只能拍摄到一个球体,主摄像机能排到一个平面,则最后呈现出来的样式是平面和球体在同一个画面当中。
FOV轴(FOV Axis):有水平和垂直两个属性,数值越大视野越广。
剪裁平面(Clipping Planes),摄像机有近面和远面,只有在这两个面之间的物体才会被摄像机渲染出来。
近面(Near)离摄像机的距离。
远面(Far)离摄像机的距离。
类似于拍照的玩法 在文件中新建一个纹理文件,然后将纹理文件拖到摄像机属性中的Target Texture上。
接着,将创建好的纹理文件直接拖到场景上的一个平面,就可以将摄像机的内容贴在平面上(拍照)。
音频播放 摄像机上默认会挂载一个AudioListener音频监听器,如果有多个摄像机,则只需要在主摄像机上保留该组件即可,否则会不停报警告。
Audio Source组件
AudioClip,音频文件挂载的地方。
3D Sounds Settings:有一个球体范围,负责最小到最大的声音收录范围。
一个Audio Source组件同时只能播放一个背景音乐,但是可以播放多个音效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 using System.Collections;using System.Collections.Generic;using UnityEngine;public class AudioTest : MonoBehaviour { public AudioClip music; public AudioClip se; public AudioSource player; private void Start () { player = GetComponent<AudioSource>(); player.clip = music; player.loop = true ; player.volume = 0.5f ; player.Play(); } private void Update () { if (Input.GetKeyDown(KeyCode.Space)) { if (player.isPlaying == false ) player.Play(); else player.Pause(); } if (Input.GetMouseButtonDown(0 )) { player.PlayOneShot(se); } } }
视频播放 Video Player组件,需要将Target Texture修改为新建的纹理文件,然后将文件拖到一个平面上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.Video;public class VideoTest : MonoBehaviour { private VideoPlayer videoPlayer; private void Start () { videoPlayer = GetComponent<VideoPlayer>(); videoPlayer.Play(); videoPlayer.Pause(); Debug.Log(videoPlayer.isPlaying); } private void Update () { } }
控制角色的移动 在角色的节点上先添加上Character Controller 组件,然后挂载上脚本进行控制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 using System.Collections;using System.Collections.Generic;using UnityEngine;public class PlayerControl : MonoBehaviour { private CharacterController controller; void Start () { controller = GetComponent<CharacterController>(); } void Update () { float horizontal = Input.GetAxis("Horizontal" ); float vertical = Input.GetAxis("Vertical" ); Vector3 movement = new Vector3(horizontal, 0 , vertical); Debug.DrawRay(transform.position, movement, Color.red); controller.SimpleMove(movement); } }
物理系统 为需要加上物理特性的节点添加上Rigidbody 组件,然后该物体就获得了物理特性。
刚体属性:
Mass(质量),表示当前物体的质量大小。
Drag,该物体运动所收到的阻力。
Angular Drag,旋转所收到的阻力。
Use Gravity,是否使用重力。
is Kinematic,是否不受外力影响。
Interpolate,是否使用插值。
Collision Detection:是否使用连续碰撞检测(消耗性能),默认为间隔检测。
Constraints:冻结某个轴或者旋转轴。
碰撞检测 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 using System.Collections;using System.Collections.Generic;using Unity.VisualScripting;using UnityEngine;public class FireTest : MonoBehaviour { public GameObject firePart; void Start () { } void Update () { } private void OnCollisionEnter (Collision collision ) { Instantiate(firePart, collision.contacts[0 ].point, Quaternion.identity); Destroy(gameObject); } private void OnCollisionStay (Collision collision ) { } private void OnCollisionExit (Collision collision ) { } }
触发器 在游戏物体上的Collider组件上勾选is Trigger即可开启触发器。(类似于Cocos上的sensor),监听触发器触发的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 private void OnTriggerEnter (Collider other ){ Debug.Log("有东西碰到我了" ); } private void OnTriggerExit (Collider other ){ } private void OnTriggerStay (Collider other ){ }
物理关节 铰链 为需要添加该物理关节的游戏对象添加组件Hinge Joint,如下图所示,可以修改铰链所在的位置以及朝向的方向。在模型上有一条褐色的箭头,便是铰链朝向的方向以及位置。
弹簧 为需要添加该物理关节的游戏对象添加组件Spring Joint,需要在下图中红框所选位置将另一刚体连接上。
固定关节 为需要添加该物理关节的游戏对象添加组件Fixed Joint,需要在途中红框所选位置将另一链接的刚体挂载上。
物理材质 物理材质可以调整游戏物体的摩擦力,弹力等属性。 首先在文件目录中新建一个物理材质(Physic Material),然后调整好相关的参数拖到对应的游戏对象对应的碰撞器上的材质选项(Material)。
射线检测 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 using System.Collections;using System.Collections.Generic;using UnityEngine;public class RayTest : MonoBehaviour { void Start () { Ray ray = new Ray(Vector3.zero, Vector3.up); } void Update () { if (Input.GetMouseButtonDown(0 )) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; bool res = Physics.Raycast(ray, out hit); if (res) { Debug.Log(hit.point); transform.position = hit.point; } RaycastHit[] hits = Physics.RaycastAll(ray); } }
粒子系统 右键场景新建效果(Effect)->粒子系统(Particle System),即可以在在场景中创建一个带有粒子系统组件的空游戏对象。 粒子系统组件的属性:
Duration:持续时间,表示粒子发射器的生存时间。
Loop:循环播放。
Prewarm:是否预热,如果勾选上,粒子就会从完全施展开之后进行播放,而不会有从无到有的扩散过程。
Start Delay:启动延迟,延迟多少秒之后启动粒子播放。
Start Lifetime:起始周期,粒子的存活周期。
Start Speed:起始速度。
Start Size:起始大小。
Start Rotation:起始角度。
Simulation Space:模拟空间,默认为世界空间。
Simulation Speed:模拟速度,默认为1,即正常播放。
Play On Wake:唤醒播放,默认为勾选,即在游戏启动的时候就播放粒子。
划线功能(Line Render) 即线段渲染器,