Unity API常用方法和类学习笔记3
------Quaternion & Rigidbody & Camera & Application
结构体Quaternion
欧拉角-----三维变量,注意:其中y轴值改变时,是绕世界坐标系中的垂直方向旋转
四元数Quaternion
一、静态变量
二、普通变量
public Transform cube;
void Start() {
print(cube.eulerAngles);//返回值为Vector3类型---同欧拉角
print(cube.rotation);//返回值为四元数
}
三、静态方法
public Transform cube;
public Transform player;
public Transform enemy;
void Start () {
//1、Euler
cube.eulerAngles = new Vector3(45, 45, 45);//通过改变结构体Quaternion的返回值为Vector3类型的普通变量的值,达到与视觉同步的旋转
cube.rotation = Quaternion.Euler(new Vector3(45, 45, 45));//将欧拉角转换为四元数
print(cube.rotation.eulerAngles);//将四元数转换为欧拉角
//2、LookRotation
Vector3 dir = enemy.position - player.position;
dir.y = 0;//不倾斜
player.rotation = Quaternion.LookRotation(dir);//让主角看向敌人
}
void Update () {
//3、Lerp & Slerp
if (Input.GetKey(KeyCode.Space))
{
Vector3 dir = enemy.position - player.position;
dir.y = 0;
Quaternion target = Quaternion.LookRotation(dir);
//player.rotation = Quaternion.Lerp(player.rotation, target, Time.deltaTime);//Time.deltaTime * 小数降低旋转速度
player.rotation = Quaternion.Slerp(player.rotation, target, Time.deltaTime);//推荐使用,动画效果平滑
}
}
类Rigidbody
—Inherits from:Component
一、自身变量及方法
public Rigidbody playerRgd;
public Transform enemy;
public int force;
void Update () {
//1、position(变量) & MovePosition(公有方法)
playerRgd.position = playerRgd.transform.position + Vector3.forward * Time.deltaTime;//比Transform.Position运行快,节省性能建议仅一次改变使用
//推荐使用,运动更平滑
playerRgd.MovePosition(playerRgd.transform.position + Vector3.forward * Time.deltaTime);
//2、rotation(变量) & MoveRotation(公有方法)
if (Input.GetKey(KeyCode.Space))
{
Vector3 dir = enemy.position - playerRgd.position;
dir.y = 0;
Quaternion target = Quaternion.LookRotation(dir);
//playerRgd.rotation = Quaternion.Lerp(playerRgd.rotation, target, Time.deltaTime);
playerRgd.MoveRotation(Quaternion.Lerp(playerRgd.rotation, target, Time.deltaTime));//更加节省性能、效果更连续、平滑
}
//3、AddForce(公有方法)---用于模拟物理效果
playerRgd.AddForce(Vector3.forward * force);
}
二、继承成员
类Camera
—Inherits from:Behaviour(类Behaviour–Inherits from:Component)
一、静态变量–main:获取Camera组件
private Camera mainCamera;
void Start () {
//mainCamera = GameObject.Find("MainCamera").GetComponent<Camera>();
mainCamera = Camera.main;//使用时需保证Camera的tag值为默认值:MainCamera
}
二、公有方法
void Update () {
//ScreenPointToRay将点转化成射线
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);//返回值为射线
RaycastHit hit;//用于存储碰撞到的游戏物体
bool isCollider = Physics.Raycast(ray, out hit);//将碰撞到的物体存储变量传入:out类型的引用参数
if (isCollider)
{
Debug.Log(hit.collider);//hit.collider就是射线所碰撞到的游戏物体碰撞器
}
Ray ray1 = mainCamera.ScreenPointToRay(new Vector3(200, 200, 0));
Debug.DrawRay(ray.origin, ray1.direction * 10, Color.yellow);//画出射线,类Debug中的静态方法
}
另:Camera上锥体范围才为视野的真正范围
三、拓展:API19Ray(射线碰撞检测)
—在类Physics当中,射线可无长度也可有长度
public GameObject player;
// Use this for initialization
void Start () {
//1、Raycast--返回值为bool类型变量
Ray ray = new Ray(player.transform.position, player.transform.forward);//Ray(起点,方向)
}
// Update is called once per frame
void FixedUpdate () {
//1、Raycast--返回值为bool类型变量
Ray ray = new Ray(player.transform.position, player.transform.forward);//Ray(起点,方向)
//此时可能会与自身发生碰撞,isCollider==true------可通过改变射线的起点避免
//重载1
bool isCollider = Physics.Raycast(ray);
//重载2
bool isCollider = Physics.Raycast(ray, 1);//+长度
//重载3
RaycastHit hit;//用于存储碰撞到的游戏物体
bool isCollider = Physics.Raycast(ray, out hit);//将碰撞到的物体存储变量传入:out类型的引用参数
Debug.Log(hit.collider);//hit.collider就是射线所碰撞到的游戏物体碰撞器
Debug.Log(hit.point);//碰撞的位置
//重载4
bool isCollider = Physics.Raycast(ray, Mathf.Infinity, LayerMask.GetMask("Enemy1", "UI"));//可多个
/*Note:LayerMask为用于在投射光线时选择性忽略碰撞器的层遮罩,即要忽略的层,Enemy1--层名
须有距离,若保持无限大--设置较大数字10000或Mathf.Infinity*/
Debug.Log(isCollider);
}
void Update()
{
//2、RaycastAll---检测所有碰撞到的物体,返回数组RaycastHit[]
RaycastHit[] hits;
hits = Physics.RaycastAll(transform.position, transform.forward, 100.0F);
}
另:2D射线—Physics2D.Raycast();具体用法与3D大同小异
四、继承成员
类Application
一、Application.xxxPath----返回路径(目录)
StreamingAssets–流文件资源(音视频资源):不会被合并;要打开需使用Application.streamingAssetsPath
常用:
print(Application.dataPath);
//返回工程路径:存放数据
print(Application.streamingAssetsPath);
//可通过文件流来进行读取的一些数据
print(Application.persistentDataPath);
//永久的数据(可持久化)
print(Application.temporaryCachePath);
//临时的缓冲数据
二、静态变量----大部分可在Build Settings…-PlayerSettings中进行设定
1、installMode–共有的静态ApplicationInstallMode类型(enumeration枚举)的变量
枚举类型ApplicationInstallMode中变量DeveloperBuild—可用此进行联调:连接设备进行错误的调试,看看在实际设备上运行有什么问题
2、isEditor–判断是否在编译器模式下运行
3、isFocused–是否处于焦点:Game窗口下是焦点
4、isMobilePlatform–是否在移动设备上运行
5、isPlaying–是否运行:只有在编译器模式下运行才会返回true
6、platform–判断当前的运行环境,返回RuntimePlatform(enumeration枚举)类型的变量:各大平台
7、productName–产品名;installerName–安装包名
8、runInBackground–判断应用是否可以在后台运行(Note: This property is ignored on Android and iOS.)
三、常用静态方法
1、OpenURL–可用于在游戏中添加网站链接
2、Quit–退出应用:在编辑器模式下调用Quit不可退出(在编辑器模式下可通过设置isPlaying=false退出)
void Start () {
//测试举例
print(Application.identifier);
print(Application.companyName);
print(Application.productName);
print(Application.installerName);
print(Application.installMode);
print(Application.isEditor);
print(Application.isFocused);
print(Application.isMobilePlatform);
print(Application.isPlaying);
print(Application.isWebPlayer);
print(Application.platform);
print(Application.unityVersion);
print(Application.version);
print(Application.runInBackground);
Application.Quit();
Application.OpenURL("www.baidu.com");
}
void Update () {
//在编辑器模式设置isPlaying=false退出
if (Input.GetKeyDown(KeyCode.Space))
{
UnityEditor.EditorApplication.isPlaying = false;
}
}
测试运行截图