我的Unity学习笔记----------API常用方法和类详解(四)

二十三. Camera组件(类)


  1. 通过获取camera组件把场景中鼠标的位置(点)转化为射线
mainCamera=GameObject.Find(“MainCamera”).GetComponent<Camera>();
  1. 获取camera组件的另一种方法:通过main camera身上的标签进行查找
    当camera的标签为MainCamera时可以使用
mainCamera=Camera.main;
Void Update()
{
     
   Ray ray=mainCamera.ScreenPointToRay(Input.mousePosition);
   RaycastHit hit;
   Bool isCollider=Physics.Raycast(ray.out hit);
   If(isCollider){
     
      Debug.Log(hit.collider);
   }
}
  1. ScreenPointToRay:屏幕上的点转化为射线
Ray ray=mainCamera.ScreenPointToRay(new
Vector3(200,200,0));

Debug.DrawRay(ray.origin,ray.direction*10,Color.yellow);

//将固定点(200,200,0)转化为一条黄色的射线

(射线的起点在屏幕上而非摄像机,视野范围是摄像机的椎体范围)


二十四.Application类


  1. Streaming Assets文件夹下的资源不会特意“unity化”,而是保留原本的资源格式和路径以便下一次读取,而不会与Unity文件一起压缩处理。

  2. Application.datePath:存放数据(工程所需要的数据)
    Application.streamingAssetsPath:通过文件流来读取的一些数据
    Application.persistentDataPath:可以进行实例化的数据
    Application.temporaryCachePath:临时缓冲数据

  3. Application.companyName:公司名
    Application.productName:产品名
    Application.isMobileplatform:判断是否为移动平台
    Application.isPlaying:判断是否正在运行游戏
    Application.runInBackground:是否可以在后台运行
    Application.Quit():退出游戏
    Application.LoadLevel():加载场景(基本上已经被弃用淘汰了)
    Application.OpenURL(“网址”):打开某个网址
    Application.CaptureScreenshot(“保存的名字”):用来截图
    在编译器模式下停止运行游戏:

if(Input.GetKeyDown(KeyCode.Space))
{
     
   UnityEditor.EditorApplication.isPlaying=false;
}

  

二十五. 加载切换游戏场景


  1. using UnityEngine.SceneManagement;
    SceneManger.LoadScene()
    单独加载整个场景,destroy之前场景的所有物体

  2. 异步加载场景的方式:
    SceneManger.LoadSceneAsync
    优点:返回AsyncOperation对象,通过该值可以判断场景加载进度
    延伸:可以设置加载进度条

  3. SceneManger中的一些方法
    sceneCount:当前加载的场景数量
    sceneCountInBuildSettings:
    CreateScene:创建场景
    GetActiveScene:获取到当前运行的场景(及其中的一些相关信息)
    GetSceneAt:获取已经加载的场景中的其他场景的一些信息


二十六. 射线检测


 Ray ray=new Ray(transform.position,
           transform.forward, transform.forward);
bool isCollider=Physics.Raycast(ray);

//射线无限长

Debug.Log(isCollider);

缺点:无法得知与射线发生碰撞的是哪个物体

Ray ray=new Ray(transform.position+transform.forward, 
transform.forward);
bool isCollider=Physics.Raycast(ray,1)//可以设置射线的长度
Debug.Log(isCollider);

Ray ray=new Ray(transform.position+transform.forward, 
transform.forward);
RaycastHit hit;
bool isCollider=Physics.Raycast(ray,out hit);
Debug.Log(isCollider);
Debug.Log(hit.collider)
//获取到碰撞到的物体的名字
Debug.Log(hit.point);
//射线碰撞到物体的点的坐标
  1. 一个关于层Layer的用法

指定不同的物体在不同的layer,射线检测可以指定射线只与某一层或者某几层的物体发生碰撞,可以有效规定出射线检测不到的物体

bool isCollider=Physics.Raycast(ray,Mathf.Infinity,

LayerMask.GetMask(“Enemy1”, “Enemy2”));

//只与在Enemy1和Enemy2两层上的物体发生碰撞

(需要专门指定,未指定的物体一般在floor层里)

  1. 2D射线检测Physics2D.Raycast()
    与3D检测使用方法相同

  2. Physics.RaycastAll()与Physics.Raycast ()的区别

射线检测默认返回检测到的第一个物体,而RaycastAll则是将所有检测到的物体形成数组返回


二十七. UGUI事件监听


1.直接拖拽

2.通过代码添加

例:

using UnityEngine.UI;

  public GameObject btnGameObject;

  btnGameObject.GetComponent<Button>().onClick.AddListener(this.
ButtonOnClick);

   Void ButtonOnClick()

               //监听Button事件

3.建立鼠标相关事件的方法:

  using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
public class UIEventManager2:MonoBehaviour,IPointerDownHandler

(会有小灯泡提示自动生成接口方法的代码)

缺点:只能监听该放置脚本的控件的事件(Raycast Target必须要确保勾选)

一些常用的鼠标事件接口实现:

IPointerDownHandler(按下)

IPointerClickHandler(点击)

IPointerUpHandler(抬起)

IPointerEnterHandler(鼠标移到该控件上面)

IPointerExitHandler(鼠标移出)

一些常用的与拖拽有关的事件接口实现:

IBeginDragHandler(开始拖拽)

IDragHandler(拖拽中)

IEndDragHandler(拖拽结束)

IDropHandler(拖拽结束后鼠标仍停留在物体上 )


二十八. 角色控制器CharacterController


得到角色组件

 private CharacterController  cc;
 public float speed=3; 

在Start函数中进行获取

cc=GetComponent<CharacterController >();

控制移动

float h = Input.GetAxis(“Horizontal”);
float v = Input.GetAxis(“Vertical”);
cc.SimpleMove(new Vector3(h,0,v)*speed);

SimpleMove有自动模拟重力使物体掉落到地面上的功能
Move没有
且move使用时需要乘以Time.deltaTime

cc. Move(new Vector3(h,0,v)*speed*Time.deltaTime);

碰撞检测

private void OnControllerColliderHit(ControllerColliderHit hit)

二十九. Mesh的设置


Mesh Filter 控制网格

Mesh Renderer  根据材质Element的设置决定物体的材质

如果游戏物体莫名变成紫色说明材质物体丢失


三十. 版本变更


对于一些因为版本变更而已经弃用的方法如audio.Play();

可以更改书写方法:

GetComponent<AudioSource>().Play();

但是更建议使用提前定义然后在Start中获取的方法,因为ComPonent的调用非常耗费性能

Public AudioSource au;
au = GetComponent<AudioSource>();

心得体会和学习总结:


经过这些天对于Unity API的系统性学习,我对于C#有了更多的了解。

之前在课堂上学习的时候虽然也做笔记,但总觉得一知半解,很多东西因为不知道为什么,所以总是记不住。

这次的学习在前期的时候让我感觉到了一种恍然大悟的感觉。就比如说前面的课程讲到Time类的时候讲到了deltaTime,我们之前做游戏的时候经常会用到,但是我一直不太清晰,所以听完了课程的讲解以后就印象深刻,还有Update和FixedUpdate的区别,实例化的方法等等,因为之前见过实例的缘故,记起来就特别容易。

中期的时候,老师把所有的Component、GameObject等等都串到了一起,我对于类、对于方法和属性、对于继承等等就清晰了起来,虽然有时还是会弄混,但是确实比之前有了很不一样的感觉。

再往后就发现,很多东西其实我们一开始就接触到了。就像后面第二次讲到Camera的时候,所用到的在屏幕上识取到鼠标的位置Input.MousePosition是之前讲Input类的时候讲到的,学到射线的时候也能发现其与Camera息息相关。

但是也有比较头疼的一面就是,干讲知识点实在是太枯燥了。如果说之前听课听到我用到学到过的方法有多欣喜多了然,那后边听到那些我没用到过甚至根本想不到有什么用的方法就有多无聊,硬着头皮好不容易听完,基本上也忘得差不多了,如果不是因为有写笔记,可能也就没有什么学习过的痕迹了。

所以还是说,学习要理论与实践相结合。至少对于我而言,我们或许记不住看起来没什么不同的知识点,但是游戏制作过程和实现的功能这种画面感较强的记忆会让我们对于运用更加得心应手。

不过其实也不是雁过无痕,下一次见到这些知识的时候,大概会觉得无比熟悉吧。说起来,到也确实是因为这些“硬着头皮”听下来的课,感觉脑子里的脉络在一点一点变得清晰。

总之也算是结束了这段学习。马上就要迎来新一轮的学习了,我也蛮期待看看自己在Unity的学习上有没有变得有些不一样。

期待下一次相遇~


小结:
关于Unity API的学习就暂且告一段落了。
以上列举出了一般情况下的常用方法和类,但是由于版本更新和个人理解有限,可能会出现一些偏差,所以具体情况具体分析。
大家也可以善用百度、谷歌等等搜索了解更多的信息。
还有就是这些知识可能过于“干”,大家在学习Unity的时候,建议结合实例进行针对性的学习和了解。
kk后续还会持续更新学习到的Unity和实际案例的学习和制作步骤,也欢迎大家关注。
一起来学习吧。
最后,学习愉快~o((≧▽≦o)

你可能感兴趣的:(unity,c#,经验分享,程序人生)