在另一个类C#中调用对象的Transform组件

时间:2017-08-22 09:48:32

标签: c# class unity3d position transform

我正在制作一个教程和“侧面目标”,他们不会引导您尝试并感受它。

因此,此时的工作方式是存在Player对象。玩家对象具有玩家脚本。

public class Player : MonoBehaviour {

private Animator anim;//reference for animator component
private Rigidbody rigidBody;//reference to component for rigidbody
private AudioSource audioSource;

[SerializeField] private float force = 100f;
[SerializeField] private AudioClip sfxJump;
[SerializeField] private AudioClip sfxDeath;


}

void Awake() {//these are assertions that will ensure when writing the cocde that you wont miss them. use for team work. 
    Assert.IsNotNull (sfxJump);
    Assert.IsNotNull (sfxDeath);

}

private bool jump = false; //check for jump 
// Use this for initialization
void Start () {//all these are getting components at the start to update them as the code goes onwards. 
    anim = GetComponent<Animator> ();
    rigidBody = GetComponent<Rigidbody> ();
    audioSource = GetComponent<AudioSource> ();
    positionStart = GetComponent<Transform> ();

}

// Update is called once per frame
void Update () {
    if (!GameManager.instance.GameOver && GameManager.instance.GameStarted) {
        if (Input.GetMouseButtonDown (0)) {//if press mouse key
            GameManager.instance.PlayerStarted ();
            rigidBody.useGravity = true;//turn gravity on for component so it goes back down.
            audioSource.PlayOneShot (sfxJump);
            anim.Play ("jump");//play the animation jump
            jump = true;
        }
    }
}
//Fixed update for physics
void FixedUpdate() {//use this for any physics due to frame rate. time.deltatime wont cut it.
    if (jump == true) {//if we are jumping, turn the jump off.
        jump = false;
        rigidBody.velocity = new Vector2 (0, 0);//turn velocity to 0 so speed doesnt increase while falling
        rigidBody.AddForce (new Vector2 (0, force), ForceMode.Impulse);//give a impulse upwards.
    }

    //print (rigidBody.velocity.y);//print velocity. turn this shit off.
}
//Code to create collision with obstacles and then die and fall through the floor.
void OnCollisionEnter (Collision collision) {//call collision component
    if (collision.gameObject.tag == "obstacle") {//if you slap a tagged object called obstacle
        rigidBody.AddForce (new Vector2 (-50, 20), ForceMode.Impulse);//add force to push back cause you ded
        rigidBody.detectCollisions = false;//turn off the ability to detect collisions
        audioSource.PlayOneShot (sfxDeath);//play ded noise
        GameManager.instance.PlayerCollided ();
        GameManager.instance.Restart ();

    }
    }
    }

游戏管理员当然存在于相机中以控制游戏的状态。

public static GameManager instance = null;//only one in memory. only one gamemanager ever.

[SerializeField] private GameObject mainMenu;
[SerializeField] private GameObject replayBtn;
[SerializeField] private GameObject playBtn;

private bool gameEnd = false;
private bool gameStarted = false;
private bool playerActive = false;
private bool gameOver = false;

//getters setters start
public bool PlayerActive {
    get { return playerActive; }
}

public bool GameOver {
    get { return gameOver; }
}

public bool GameStarted {
    get { return gameStarted; }
}
//to create a state between gameover and main menu
public bool GameEnd {
    get {return gameEnd; }
}
//getter setters end
void Awake(){
    if (instance == null) {
        instance = this;//this means the current instance. one instance of this class.
    } else if (instance != this) {//if a seocnd one gets created destroy that bitch.
        Destroy (gameObject);
    }
    DontDestroyOnLoad (gameObject);//allows a game object to persist between the scene. Dont need with one scene.

}

// Use this for initialization
void Start () {
    replayBtn.SetActive (false);

}

// Update is called once per frame
void Update () {

}

public void PlayerCollided(){
    gameOver = true;
}

public void PlayerStarted(){
    playerActive = true;

}
public void EnterGame (){
    mainMenu.SetActive(false);
    gameStarted = true;
}
//When player dies start coroutine Hold.
public void Restart (){
    StartCoroutine (Holdexit());

}
//The hole Coroutine waits 2 seconds then turns on the menu.
IEnumerator Holdexit (){
    yield return new WaitForSeconds (2);
    playBtn.SetActive (false);
    replayBtn.SetActive (true);
    mainMenu.SetActive (true);
    //add character movement to location

}
}

因此,当玩家击中他死亡的物体时,失去了触碰碰撞器并跌落地图的能力,2秒后主菜单返回并且播放按钮被替换为重放按钮。当我按重播时,我需要重置位置,游戏状态和碰撞能力。

我试过各种各样的事情。我做了一个转换的get组件,并尝试在协程中调用它然后将其设置在那里,但我无法弄明白。我尝试在游戏管理器状态重新启动之后改变位置,然后在主菜单重新启动之前发生位置更改,因为它没有在协同程序中使用。

一旦我能够工作,我是否创造了一种新方法,

  public void PlayerReset (){
  if (GameManager.instance.Restart()){
  //put new changes to player here.  
   }
  }

我遇到的错误是我无法将类型void转换为bool,我假设其原因我试图说明重启实例是否存在然后是函数,但重启函数的创建方式不是true或false它只是 - 是。

我非常感谢任何帮助。我想我要尝试做的是将另一个脚本放到一边并让它调用播放器类来拉取组件,然后从那里操纵它们。 AUGH。太混乱了。 LMAO。

2 个答案:

答案 0 :(得分:0)

您只需在对象上设置公共Transform变量,然后在检查器中,将要调用的所选变换拖动到该变量。

完成后,您可以以任何方式使用该变换变量。

答案 1 :(得分:0)

  1. 您可以将玩家的起始位置保存在GameManager中,因为它是一个单身人士。因此,您在重新启动后将玩家的位置设置为此保存位置。
  2. 您需要在重启时重新初始化所有变量(即gameEnd,gameStarted,playerActive,gameOver等)。
  3. if(GameManager.instance.Restart())无效,因为重新启动()会返回void而不是布尔值。