Unity3D通过碰撞拾取物体
发表于2019-01-21
注:此例子为2D场景
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457bb035078.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457ca8f02cb.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457cea81f32.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457cf0d3208.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457d0603f54.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457d0b86866.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457d7f8a714.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457d8520c50.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457d8ab1f14.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457e0d39596.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457e31e9a8b.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457e3776ab8.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457e3d13672.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457e42c0391.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457ea7a89ea.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457ead42d6e.png)
原理:通过操控角色碰撞可拾取物体,通过按键确认拾取到角色指定位置。
具体代码实现
角色代码:
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、开始时
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457bb035078.png)
物体属性
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457ca8f02cb.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457cea81f32.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457cf0d3208.png)
2、拾取物体至头部
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457d0603f54.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457d0b86866.png)
3、脱下物体时
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457d7f8a714.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457d8520c50.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457d8ab1f14.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457e0d39596.png)
4、脱下后
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457e31e9a8b.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457e3776ab8.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457e3d13672.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457e42c0391.png)
角色设置:
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457ea7a89ea.png)
![Unity3D通过碰撞拾取物体](http://gadimg-10045137.image.myqcloud.com/20190121/5c457ead42d6e.png)
相关解释:
1、拾取物体需要提前在角色设定好拾取后出现的位置。
2、需要设定被拾取物体改变为触发器的时间。假设没有设置时间,当被拾取物体碰撞地面立刻变为触发器,会保持原来的速度一直下落,所以设定这个时间相当于冷却,当被拾取物体碰撞地面,等待一段时间再改变属性为触发器。