Unity3D 通过碰撞拾取物体

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

 

 

此方法为初学unity所想,如有错误请谅解,还望指正。

Unity3D是一款强大的游戏开发引擎,其中捡起物品通常是角色扮演游戏(RPG)或模拟游戏中的基本交互功能。以下是一个简单的步骤来实现捡起物品的功能: 1. **创建项目和资源**: 首先,在Unity中创建一个新的项目,然后添加一个可拾取物体(如宝箱、道具等)。给物体添加一个脚本,通常命名为`PickupScript`,并为它设置一个碰撞器组件。 2. **编写脚本**: 在`PickupScript`中,你需要定义一个公共方法,例如`OnPickUp()`,当物体被玩家角色碰撞到时会被调用。在这个方法中,你可以初始化一些逻辑,比如改变物品的状态,增加分数,或者将物体从场景中移除。 ```csharp public class PickupScript : MonoBehaviour { [SerializeField] private GameObject itemToDrop; // 存储被捡起后要丢弃的物体 void OnCollisionEnter(Collision collision) { if (collision.gameObject.CompareTag("Player")) // 检查是否与玩家角色碰撞 { OnPickUp(); } } public void OnPickUp() { // 更新物品状态(如显示在背包中) Debug.Log("Item picked up!"); // 移除当前对象 Destroy(gameObject); // 如果有,将对象放入掉落列表 Instantiate(itemToDrop, new Vector3(0, 0, 0), Quaternion.identity); } } ``` 3. **添加捡起动画或反馈**: 可以添加一个动画来显示物品被捡起的过程,或者在UI上显示拾取信息。 4. **测试**: 在Unity编辑器中测试,确保捡起行为按预期工作。玩家角色碰撞到物品时,物品应消失并在合适的位置重生。 相关问题: 1. 如何在Unity中为游戏对象添加碰撞检测? 2. Unity的`TagSystem`如何用来标记特定的游戏对象? 3. 如何在Unity中创建并播放动画效果?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值