unity学习笔记(持续更新)
1.点哪指向哪
if (Input.GetMouseButtonDown(0))
{
//相机向指定的物体发出射线,并返回
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//射线可以跟collider组件的物体发生碰撞
RaycastHit hit;//碰撞的信息
//表示是否碰到东西
if (Physics.Raycast(ray, out hit))
{
transform.LookAt(new Vector3(hit.point.x, transform.position.y, hit.point.z));
}
}
2.物体的旋转
#region 方法一
//设置炮台方向跟小球一个方向
//transform.forward = ball.position - transform.position;
#endregion
#region 方法二
// transform.LookAt(ball);
#endregion
//Vector3.Angle得到的夹角只会返回正夹角
#region 方法二 改旋转
//改旋转轴
// Vector3 ballPos = ball.position - transform.position;
// float angle = Vector3.Angle(ballPos,dir);
Vector3 axis = Vector3.Cross(dir, ballPos);
// dir = ballPos;
// //dir = new Vector3(ballPos.x, 0, ballPos.z);
// transform.Rotate(Vector3.up, angle);
// transform.Rotate(axis, angle);
//改旋转角度
Vector3 ballPos = ball.position - transform.position;
float angle = Vector3.Angle(ballPos,dir);
Vector3 axis = Vector3.Cross(dir, ballPos);
float result = Vector3.Dot(axis, Vector3.up);
//根据传入值的符号返回,如果传入的值为负,则返回-1,否则返回1
result = Mathf.Sign(result);
dir = ballPos;
angle *= result;
transform.Rotate(Vector3.up, angle);
3.键盘事件
键盘输入 Input.GetKey 长安一个键不放,每帧判断一次 Input.GetKeyDown 按下某个键,只判断一次 Input.GetKeyUp 松开某个键,只判断一次
if (Input.GetKeyUp(KeyCode.W))
{
Debug.Log("往前走");
}
if (Input.GetKeyDown(KeyCode.A))
{
transform.Translate(new Vector3(-speed, 0, 0));
Debug.Log("往左走");
}
if (Input.GetKeyDown(KeyCode.D))
{
transform.Translate(new Vector3(speed, 0, 0));
Debug.Log("往右走");
}
if (Input.GetKeyDown(KeyCode.S))
{
transform.Translate(new Vector3(0, 0, -speed));
Debug.Log("往下走");
}
4.鼠标事件
鼠标输入 Input.GetMouseButton 按住不放 每帧判断 Input.GetMouseButtonDown 点击时 判断一次 Input.GetMouseButtonUp 松开时 判断一次 0代表鼠标左键,1代表右键,2代表中键
if (Input.GetMouseButtonDown(0))
{
print("点击左键");
}
if (Input.GetMouseButtonDown(0))
{
print("点击右键");
}
if (Input.GetMouseButtonDown(0))
{
print("点击中键");
}
5.通过GUI代码改ui
//OnGUI为每帧执行
private void OnGUI()
{
GUIStyle style = new GUIStyle();
style.fontSize = 20;
style.normal.textColor = Color.blue;
GUI.Label(new Rect(0, 0, 500, 300), "得分:"+ sum,style);
}
private void OnGUI()
{
if( GUI.Button(new Rect(Screen.width / 2 - width / 2, Screen.height / 2 - height / 2, width, height), "开始游戏"))
{
SceneManager.LoadScene(1);
}
}
6.场景的切换
1.引入命名空间
using UnityEngine.SceneManagement;
2.场景跳转
SceneManager.LoadScene("SampleScene");
7.物理碰撞
private void OnCollisionEnter(Collision collision){}
8.普通的碰撞
private void OnTriggerEnter(Collider other){}
9.公转
transform.RotateAround(target.position, Vector3.up, angle * Time.deltaTime);
10.物体跟随鼠标转
Vector3 mousePos;
public float rate;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
mousePos = Input.mousePosition;
}
if (Input.GetMouseButton(0))
{
//鼠标移动的偏移量
Vector3 offest = Input.mousePosition - mousePos;
//旋转物体
transform.eulerAngles += Vector3.down * offest.x * rate;
mousePos = Input.mousePosition;
}
}
11.获取子节点在父节点下的坐标
字符节点的操作都是在transfrom 组件上完成的
//通过下标获取子节点
transform.GetChild(index)
GameObject.Find("needles").transform.GetChild(0).position = new Vector3(0, 0.7f, -5);
//获取子节点在父节点下的下标
transform.GetSiblingIndex();
//子节点的个数
transform.childCount
12.给物体给力让其运动
if (Input.GetKey(KeyCode.A))
{
GetComponent<Rigidbody>().AddForce(Vector3.left * v);
}
if (Input.GetKey(KeyCode.S))
{
GetComponent<Rigidbody>().AddForce(Vector3.back * v);
}
if (Input.GetKey(KeyCode.D))
{
GetComponent<Rigidbody>().AddForce(Vector3.right * v);
}
if (Input.GetKeyDown(KeyCode.Space))
{
GetComponent<Rigidbody>().AddForce(Vector3.up * v * 30);
}
13.计时器
Invoke("spinDrop", 1.0f);
14.世界坐标转本地坐标
Vector3 dir = new Vector3(horizontal, 0, vertical);
//将世界坐标转换成本地坐标
dir = transform.TransformDirection(dir);
15.控制一个值的最大值和最小值,即范围
xAngle = Mathf.Clamp(xAngle, yMin, yMax);
16.代码控制动画
Play("ation 1" );,播放动画,传入参数为动画名字
Stop("ation 1") ,停止动画,传入参数为动画名字
CrossFade("ation 1", 0.5f); ,有过度的切换动画,传入参数(动画名字,过度时间)
17.隐藏鼠标
//隐藏锁定鼠标
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
18.节点的销毁
Destroy(this.gameObject,1); //1秒后销毁
19.查找节点
//从当前场景中所有的物体里寻找叫这个名字的物体 返回值是GameObject类型
// 找到第一个同名的节点,费性能,概率性找不到,可能会有多个重名的物体
GameObject.Find()
//从transfrom组件的子物体中寻找叫这个名字的物体,找不到孙子节点 返回值是Transfrom类型
transfrom.Find()
20.Gizmos 标记
//和update类似,也是每帧调用一次
//OnDrawGizmos是在代码编译完成时开始执行
private void OnDrawGizmos()
{
//Gizmos.DrawCube(Vector3.zero, Vector3.one);
Gizmos.color = Color.red;
for (int i = 0; i < points.Length - 1; i++)
{
Gizmos.DrawLine(points[i].position, points[i + 1].position);
}
}
21.数据本地保存
PlayerPrefs.SetInt("num",num);
PlayerPrefs.GetInt("num",0);
22.代码绑定按钮点击事件
//只能是无参无返回值的函数
GetComponent<Button>().onClick.AddListener(OnClick);
25.高亮的实现
https://www.jianshu.com/p/23fb2f6fcfa0
26.防止射线点击ui 的时候穿透
EventSystem.current.IsPointerOverGameObject() 如果当前鼠标在 ui 上返回true 否则返回false
27.关于脚本组件属性的注释
[Header("两次巡逻的间隔时间")] //注释
public float patrol_waite_time = 3;//两次巡逻的间隔时间
[SerializeField] //在面板显示私有的属性
float timer;//实现计时器的参数
|