Unity入门学习Day03

目录

(四)Unity函数的生命周期

(五)游戏组件获取与控制

(六)Time类

(七)Mathf类

(八)PlayerPrefs

(九)碰撞检测


(四)Unity函数的生命周期

(五)游戏组件获取与控制

首先先获取到该游戏物体,再通过GetComponent<T>()来获取游戏物体身上的组件。

gameObject.GetComponent<T>();

这个地方要注意避免空引用问题,所以在执行相关代码前,要增加一个if判断,如果获取的不为空蔡执行相关代码。

gameObject.AddComponent<T>();

 删除组件

Destroy(某component);

 组件失活/激活

某component.enabled = false;   某component.enabled = true ;

资源加载

GameObject obj=Resources.Load<GameObject>("Prefab/Tank") ;//这是将硬盘资源加载到内存中的一种方法,可以代替拖拽预制体到脚本的方法,前面加载个if判断可以避免重复执行提高效率。

Instantiate(obj);//在场景中实例化。

 扩展学习:血条制作

    public float xOffset;
    public float yOffset;
    public RectTransform recTransform;
 

    void Update()
    {
        Vector2 player2DPosition = Camera.main.WorldToScreenPoint(transform.position);//将玩家世界坐标转换成屏幕坐标
        recTransform.position = player2DPosition + new Vector2(xOffset, yOffset);//屏幕坐标加上偏移就得到UI坐标

        //血条超出屏幕就不显示
        if (player2DPosition.x > Screen.width || player2DPosition.x < 0 || player2DPosition.y > Screen.height || player2DPosition.y < 0)
        {
            recTransform.gameObject.SetActive(false);
        }
        else
        {
            recTransform.gameObject.SetActive(true);
        }
    }

(六)Time类

    public Text timeText1;
    public Text timeText2;
    public Text timeText3;
  
    void Update()
    {
        timeText1.text = "Time.time:"+Time.time;//游戏场景开始至目前的时间,会受到timeScale的影响
        timeText2.text = "Time.deltaTime:" + Time.deltaTime;//两帧之间的时间间隔,会随着游戏复杂变大,也会受到time=Scale的影响。
        timeText3.text = "Time.unscaleTime" + Time.unscaledTime;//游戏场景开始至目前的时间,不会受到timeScale的影响
        if(Input.GetKeyDown(KeyCode.Z))
        if(Input.GetKeyDown(KeyCode.Z))
        {
            Time.timeScale = 0.1f;
        }
        if(Input.GetKeyDown(KeyCode.X))
        {
            Time.timeScale = 1f;
        }
        if(Input.GetKeyDown(KeyCode.C))
        {
            Time.timeScale = 0f;
        }
    }

(七)Mathf类

 Mathf.Clamp

    public int blood;

    void Start()
    {
        /*Mathf.Clamp()用来规范一些值得取值范围,只能在范围内取值,超出范围取阈值*/
        blood = 20;
        blood = Mathf.Clamp(blood, 0, 100);
        Debug.Log("blood:"+blood);//结果显示20;

        blood = 103;
        blood = Mathf.Clamp(blood, 0, 100);
        Debug.Log("blood:" + blood);//结果显示100;

        blood = -10;
        blood = Mathf.Clamp(blood, 0, 100);
        Debug.Log("blood:" + blood);//结果显示0;
    }

 Mathf.Lerp / Mathf.SmoothDamp

    float lerpTest;
    float dampTest;
    float speed;
    void Update()
    {
        //lerpTest的值是无限插值接近10的,有个尾部缓动的效果。
        lerpTest = Mathf.Lerp(lerpTest, 10, 0.1f);
        //SmoothDamp插值比Lerp更细腻,计算更复杂。
        dampTest = Mathf.SmoothDamp(dampTest, 10, ref speed, 1, 3);
    }

 Mathf.PingPong:让数值在0到Length之间来回往返

(八)PlayerPrefs

以键值对的方式记录在注册表里面的。只能储存3种基础数据类型:int float string 。

    public Text text;
    void Start()
    { 
        if (PlayerPrefs.GetString("Name") == "")//String初始值是“” int初始值是0,float初始值是0f
            PlayerPrefs.SetString("Name", "瓜瓜");
        text.text = PlayerPrefs.GetString("Name");
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            PlayerPrefs.SetString("Name", "蛋蛋");
            text.text= PlayerPrefs.GetString("Name");
        }
        if (Input.GetKeyDown(KeyCode.D))
        {
            PlayerPrefs.DeleteKey("Name");
        }
    }

(九)碰撞检测

碰撞检测发生的条件:两个游戏物体发生碰撞,必须有一方有刚体组件,两方都必须有碰撞体组件。

关于几大组件的理解

Transform:
在Unity3D中,一个空的GameObject是只有Transform信息的,记录该物体的 位置信息。
Renderer:
当一个GameObject拥有了Renderer(以及它所依赖的MeshFilter和Material等),它就会显示在我们的场景当中,表现的就是该物体有 视觉信息。

这时想象你站在该物体的附近,如果你面向该物体的位置(Transform),你就可以看到该物体在你眼前(Renderer)。但如果这时你情不自禁想伸手去摸,你是不会打到前排观众的头造成纠纷的。

Collider:
我们给当前的GameObject再加上一个Collider组件(或者新建一个Cube,该GameObject会包含Transform、MeshFilter、Collider、MeshRenderer这四个组件),这时该物体就有了 空间占位信息。

这时你再伸手去摸,你会发现你可以触碰到该物体了。但是在现实中,一个物体是会受到重力影响向下落的,或者这是一张放在桌上的钞票,你会发现你无法将它拿起并放入口袋。

Rigidbody:
我们再给该物体加上Rigidbody组件,这时该物体就有了质量、速度、移动方向等 质能信息,并可以响应外界的物理影响。

这时的钞票,你就可以看到它、碰到它、捡起它了。

综上,在“Collider”和“Rigidbody”的区分中引入第三者“Renderer”,它们就构成了模拟一个物体所需要三个基础特性:看不看得见-Renderer,摸不摸得着-Collider,挪不挪得动-Rigidbody。

Rigibody:刚体

 

Mass:质量

Drag:摩擦力

Angular Drag:转弯阻力

Use Gravity:是否使用重力

Is Kinematic:运动学刚体,当两个刚体发生碰撞,它不会发生位移。

Collision Detection:碰撞检测,分为三种,Discrete离散型检测、Continuous连续型检测、Continuous Dynamic连续性动态检测;检测精度依次增高。

Constraints:锁轴。Freeze Position锁轴位移;Freeze Rotation锁轴旋转。

    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("Enter:"+collision.gameObject.name);
    }
    private void OnCollisionStay(Collision collision)//触发时每帧被调用一次
    {
        Debug.Log("Stay:" + collision.gameObject.name);
    }
    private void OnCollisionExit(Collision collision)
    {
        Debug.Log("Exit:" + collision.gameObject.name);
    }

Collider:碰撞体

 Is Trigger:是否转变为触发器,如果勾选则不会被碰撞,只会单纯检测。

Material:物理材质。涉及该碰撞体的摩擦力、阻力、弹性等信息。

Center:碰撞体的位置

Size:碰撞体的大小。

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("Enter:" + other.gameObject.name);
    }
    private void OnTriggerStay(Collider other)//触发的时候每帧调用一次
    {
        Debug.Log("Stay:" + other.gameObject.name);
    }
    private void OnTriggerExit(Collider other)
    {
        Debug.Log("Exit:" + other.gameObject.name);
    }

注意:刚体碰撞检测器和触发器的检测代码不会因为脚本失活而失效。

猜你喜欢

转载自blog.csdn.net/m0_70379630/article/details/125574500