unity入门之Resources、OnGUI、Time、Mathf、PlayerPrefs、碰撞器和触发器

1、Resources 加载游戏资源

private GameObject bullet;
public GameObject bulletPos;
void update(){
	if (Input.GetKeyDown(KeyCode.Space))
    {
        if(bullet == null)
        {
            bullet = Resources.Load<GameObject>("Prefabs/bullet");
        }
        GameObject go = Instantiate(bullet,bulletPos.transform.position,Quaternion.identity);
        go.transform.rotation = bulletPos.transform.rotation;
    }
}

在这里插入图片描述

2、OnGUI

public class OnGUIAPI : MonoBehaviour
{
    string labelShow = "show";
    bool toggle = false;
    float slider = 0;
    int selected = 0;
    float value = 0;
    private void OnGUI()
    {
        GUI.Label(new Rect(200, 200, 50, 50), labelShow);

        //if(GUI.Button(new Rect(200, 250, 50,50), "btn"))
        //{
        //    labelShow = "你点击了按钮";
        //}

        toggle = GUI.Toggle(new Rect(200, 250, 50, 50), toggle, "toggle");
        if (toggle)
        {
            labelShow = "toggle为true";
        }
        else
        {
            labelShow = "show";
        }
        //垂直滑动条
        slider = GUI.VerticalSlider(new Rect(200, 300, 50, 100), slider, 10, 0);
        labelShow = slider.ToString();
        //水平滑动条
        slider = GUI.HorizontalSlider(new Rect(400, 300, 100, 50), slider, 0, 10);
        labelShow = slider.ToString();
        //工具栏
        selected = GUI.Toolbar(new Rect(500, 300, 50, 50), selected, new string[] { "toolbar01", "toolbar02", "toolbar03" });
        labelShow = selected.ToString();
        //滚动条
        value = GUI.VerticalScrollbar(new Rect(500, 100, 20, 100), value, 1, 10, 0);
        labelShow = value.ToString();
    }
}
血条

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public class LifeBar : MonoBehaviour
{
    public GameObject player;
    string labelShow = "show";
    private void OnGUI()
    {

        Vector3 pos = Camera.main.WorldToScreenPoint(player.transform.position);
        labelShow = pos.ToString();
        GUI.Label(new Rect(pos.x,Screen.height - pos.y, 100, 50), "血   条");
    }
}

在这里插入图片描述

3、Time

*Time.time、Time.deltaTime受时间缩放影响
Time.time游戏开始到当前时间;Time.deltaTime游戏上一帧到当前帧的时间
Time.unscaledTime 真实时间,不接受时间缩放影响*
public class TimeTest : MonoBehaviour
{
    float time = 0;
    int isSelect = 0;
    private void Update()
    {
        time += Time.deltaTime;
        if(time >= 5)
        {
            Debug.Log("....");
            time = 0;
        }
    }
    private void OnGUI()
    {
        GUI.Label(new Rect(100, 100, 400, 50), "Time.time" + Time.time + "," + "Time.unscaledTime:" + Time.unscaledTime);
        GUI.Label(new Rect(100, 200, 400, 50), "Time.deltaTime" + Time.deltaTime + "time:" + time);
        GUI.Label(new Rect(100, 300, 400, 50), "Time.fixedTime" + Time.fixedTime+"," + "Time.fixedDeltaTime" + Time.fixedDeltaTime);
        isSelect = GUI.Toolbar(new Rect(400, 200, 200, 100), isSelect,
            new string[] { "TimeScale:0.05", "TimeScale:1.5", "TimeScale:1" });
        switch (isSelect)
        {
            //Time.timeScale 时间缩放,小于 1 就是时间流逝变慢,大于 1 表示时间流逝变快
            case 0:
                Time.timeScale = 0.05f;
                break;
            case 1:
                Time.timeScale = 1.5f;
                break;
            case 2:
                Time.timeScale = 1;
                break;
            default:
                break;
        }
    }
}

4、Mathf

1)、Lerp: 一直到接近 10 ----- lerpTest = Mathf.Lerp(lerpTest, 10, 0.1f);

在这里插入图片描述

2)、SmoothDamp 比较紧凑一些、比较细腻一些 、一直到接近 10 ----- dampTest = Mathf.SmoothDamp(dampTest, 10, ref speed, 1, 3);

在这里插入图片描述

3)、Clamp规范一些值的范围,小于最小值取最小值;大于最大值取最大值;正常在取值范围内,就取正常值。
public class MathfTest : MonoBehaviour
{
    private int blood;

    void Start()
    {
        //规范一些值的范围,小于最小值取最小值,大于最大值取最大值
        //正常在取值范围内,就取正常值
        //public static int Clamp(int value, int min, int max);
        //public static float Clamp(float value, float min, float max);
        blood = 120;
        blood = Mathf.Clamp(blood, 0, 100);
        Debug.Log(blood);//100
    }

    private float lerpTest = 0;
    private float dampTest = 0;
    float speed;
    public GameObject cube;

    private void Update()
    {
        匀速
        //if(cube.transform.position.x < 10)
        //{
        //    cube.transform.position += new Vector3(0.01f, 0, 0);
        //}

        //差值 a = Lerp(float a,float b,float t);
        // (b - a) * t + a

        /*
         (10-0) * 0.1 + 0 = 1;
        (10 - 1) * 0.1 + 1 = 1.9
        ......
         */
        lerpTest = Mathf.Lerp(lerpTest, 10, 0.1f);
        Debug.Log("lerpTest: " + lerpTest);
        cube.transform.position = new Vector3(lerpTest, 0, 0);

        /*
            SmoothDamp比Lerp更细腻,作为修改摄像机跟随中的摄像机更细腻
         */
        dampTest = Mathf.SmoothDamp(dampTest, 10, ref speed, 1, 3);
        Debug.Log("dampTest: " + dampTest);
        cube.transform.position = new Vector3(dampTest, 0, 0);
    }
}

5、PlayerPrefs

*unity3d提供了一个用于本地持久化保存与读取的类--PlayerPrefs。
工作原理非常简单,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值。

Playerprefs常用静态方法:
SetFloat(),SetInt(),SetString()写入数据
GetFloat(),GetInt(),GetString()读取数据*

6、碰撞器 、 触发器

碰撞器:Box Collider (盒碰撞体),Mesh Collider (网格碰撞体)等
触发器:只需要在检视面板中的碰撞器组件中勾选 Is Trigger 属性选择框

碰撞检测:

 *OnCollisionEnter(Collision collision) 当进入碰撞器
	OnCollisionExit(Collision collision) 当退出碰撞器
	OnCollisionStay(Collision collision) 当逗留碰撞器*

触发检测:

*OnTriggerEnter(Collider collider) 当进入触发器
OnTriggerExit(Collider collider) 当退出触发器
OnTriggerStay(Collider collider) 当逗留触发器*

碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性

*当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器*

例子:

碰撞器:汽车被撞飞、皮球掉在地上又弹起效果
触发器:人站在靠近门的位置门自动打开效果

另外,collider的性能和效率大概的顺序是:Sphere Collider > Capsule > Box Collider > Mesh Collider.

碰撞器是另一种组件,它和刚体一起,来使碰撞发生。
如果两个刚体撞在一起,物理引擎将不会计算碰撞除非它们包含一个碰撞器组件。
没有碰撞器的刚体,会在物理模拟中相互穿透。碰撞器必须独立于刚体加在对象上。
碰撞器并不一定需要附加刚体,但是要使移动物体具有碰撞效果必须附加刚体。
为了使两个触发器碰撞时发出碰撞事件,其中一个必须包含刚体。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ོꦿ映ꦿ言᭄﹆ོོོ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值