unity3D游戏开发文档|unity学习笔记(持续更新)

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.键盘事件
【unity3D游戏开发文档|unity学习笔记(持续更新)】键盘输入
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().AddForce(Vector3.left * v); } if (Input.GetKey(KeyCode.S)) { GetComponent().AddForce(Vector3.back * v); } if (Input.GetKey(KeyCode.D)) { GetComponent().AddForce(Vector3.right * v); }if (Input.GetKeyDown(KeyCode.Space)) { GetComponent().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

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; //实现计时器的参数

    推荐阅读