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.键盘事件

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

你可能感兴趣的:(unity3D游戏开发文档,unity)