Unity3D通过碰撞拾取物体

发表于2019-01-21
评论0 5.6k浏览
注:此例子为2D场景

原理:通过操控角色碰撞可拾取物体,通过按键确认拾取到角色指定位置。

具体代码实现

角色代码:
public class playctr: MonoBehaviour
{
    public Transform pphead;          //物体头部位置
    private GameObject heads;         //获取头部物体
    bool gethead = false;             //判断头部物体显示
    void OnTriggerStay2D(Collider2D other)
    {
        if (other.gameObject.tag == "head")          //碰撞的物体标签为头部时
        {
            Debug.Log("please get E");
            if (Input.GetKey(KeyCode.E))             //按下e装备物体
            {
                other.gameObject.SetActive(false);  //取消被拾取物体的显示
                other.gameObject.tag = "phead";     //改变被拾取物的标签
                gethead = true;                     //存在可装备头部物体
                heads = other.gameObject;           //获取头部物体
            }
        }
    }
    void FixedUpdate()
    {
        if (gethead)//当存在可装备头部物体
        {
            heads.gameObject.SetActive(true); //显示物体
            heads.GetComponent<Transform>().position = pphead.GetComponent<Transform>().position;//将物体绑定在人物身上
        }
        if (Input.GetKey(KeyCode.G) && heads.gameObject.tag == "phead")//当按下G且头部物体标签为phead时(简单说就是脱下装备)
        {
            gethead = false;//改变头部物体判断为不存在
        }
    }
}

被拾取物体代码
public class movv : MonoBehaviour
{
    bool tlow = false;         //装备存在物理属性掉落
    public float stoptime;     //改变装备为触发器等待时间
    void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.G) && this.gameObject.tag == "phead")//按下g脱掉装备
        {
            this.gameObject.tag = "head";
            tlow = true; 
        }
if (tlow) //装备变为存在物理属性
        {
            this.GetComponent<BoxCollider2D>().isTrigger = false;
            this.GetComponent<Rigidbody2D>().gravityScale = 1;
        }
        if (this.GetComponent<Rigidbody2D>().gravityScale == 0) //装备的重力为0(改变为触发器)
        {
            this.GetComponent<BoxCollider2D>().isTrigger = true;
        }
    }
    void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.collider.tag == "land")//碰撞地面 
        {
            StartCoroutine(stop());
        }
    }
    IEnumerator stop()//等待时间过后改变装备属性
    {
        yield return new WaitForSeconds(stoptime);
        tlow = false;
        this.GetComponent<Rigidbody2D>().gravityScale = 0;
    }
}

拾取过程:

1、开始时

物体属性



2、拾取物体至头部


3、脱下物体时




4、脱下后




角色设置:


相关解释:

1、拾取物体需要提前在角色设定好拾取后出现的位置。

2、需要设定被拾取物体改变为触发器的时间。假设没有设置时间,当被拾取物体碰撞地面立刻变为触发器,会保持原来的速度一直下落,所以设定这个时间相当于冷却,当被拾取物体碰撞地面,等待一段时间再改变属性为触发器。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引