加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 按钮单击无法正常工作

发布时间:2020-12-15 20:57:08 所属栏目:百科 来源:网络整理
导读:我不知道我做错了什么2D项目有两个对象.一个有RigidBody2D和BoxCollider2D组件.第二个对象只有BoxCollider2D.当按下按钮Object1落在Object2上并且再次销毁和实例化Object1时,底部有一个按钮.但是当Object1 Instantiate然后单击按钮不起作用.错误就像这样: R
我不知道我做错了什么2D项目有两个对象.一个有RigidBody2D和BoxCollider2D组件.第二个对象只有BoxCollider2D.当按下按钮Object1落在Object2上并且再次销毁和实例化Object1时,底部有一个按钮.但是当Object1 Instantiate然后单击按钮不起作用.错误就像这样:

Rigidbody2D类型的对象已被破坏,但您仍在尝试访问它.您的脚本应该检查它是否为null或者您不应该销毁该对象.

对象1:

enter image description here

对象2:

enter image description here

按钮单击:

enter image description here

对象1脚本:

public class Object1 : MonoBehaviour {

    public static Object1 instance;

    [SerializeField]
    private Rigidbody2D body;

    [SerializeField]
    private bool hasdropped;

    [SerializeField]
    private bool click;

    [SerializeField]
    private float PointerPos;

    [SerializeField]
    private float BorderX;

    void Awake(){

        if (instance == null) {

            instance = this;
        }

        //take width of screen
        Vector3 gameScreen = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width,Screen.height,0));

        BorderX = gameScreen.x - 0.6f;




        body.isKinematic = true;
        click = true;
        hasdropped = true;


    }



    void FixedUpdate () {

        if (click) {

            Vector3 temp = transform.position;

            PointerPos = Camera.main.ScreenToWorldPoint(Input.mousePosition).x;

            temp.x = Mathf.Clamp(PointerPos,-BorderX,BorderX);

            body.position = temp;

            if(hasdropped){
                return;

            }

        }


    }

    public void ButtonClick(){

        body.isKinematic = false;

    }


}

对象2脚本:

public class Object2 : MonoBehaviour {

    [SerializeField]
    private GameObject BallClone;




    void OnCollisionEnter2D(Collision2D target){

        Destroy (target.gameObject);

        Instantiate (BallClone,new Vector3(0f,2f,59f),Quaternion.identity);


    }

}

解决方法

问题是您在ClickButton On Click()上引用了Object1Prefab(活动对象,而不是预制件). (但参考预制件根本不起作用)

你破坏了它,你错过了链接. (检查一下:选择层次结构上的ClickButton对象,有脚本引用,对吗?单击游戏按钮一次.现在取消选择并再次选择层次结构上的ClickButton对象…它已消失.)

尝试创建一个监听器或将ButtonClick()方法放在object2(你不破坏)中:

using UnityEngine;
using System.Collections;

public class Object2 : MonoBehaviour {

    [SerializeField]
    private GameObject BallClone;

    public GameObject mine;


    void OnCollisionEnter2D(Collision2D target){

        Destroy (target.gameObject);

        mine = Instantiate (BallClone,Quaternion.identity) as GameObject;


    }




public void ButtonClick(){
//this is just an example. You might wanna to cache this info for better practice and not call GetComponent all the time
            mine.GetComponent<Rigidbody2D> ().isKinematic = false;
        }




}

1-将GameObject1Prefab(实时对象)拖到“我的”字段上的Object2脚本中.参考公共GameObject矿.

第一次点击你会销毁它,并创建一个新的,并在线上再次以编程方式引用新的:

mine = Instantiate (BallClone,Quaternion.identity) as GameObject;

在ClickButton对象上,在On Click()上拖动GameObject2而不是1.

这个清楚吗?对不起我的英文. :?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读