- Home /
Destory/Collect object to open door
I can't quite find the solution for the problem I'm facing. I have a script that has a player collect an object(s). Below is the script I have so far on the character. The character is able to run into the object(s) and it disappears. What I want to happen is after they collect the object(s), a set of sliding doors open. I think a transform could be used on the doors but I'm not sure.
(I imported my door from Maya, so both parts of the doors are a child of a parent.)
Example:
collect object A = Door A to slides open automatically
collect object B = Door B to slides open automatically
collect object C = Door C to slides open automatically
etc...
using System.Collections; using System.Collections.Generic; using UnityEngine;
public class PlayerController : MonoBehaviour {
public float speed;
private Rigidbody rb;
void Start ()
{
rb = GetComponent<Rigidbody> ();
}
void FixedUpdate ()
{
float moveHorizontal = Input.GetAxis ("Horizontal");
float moveVertical = Input.GetAxis ("Vertical");
Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
rb.AddForce (movement * speed);
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag ("Collect"))
{
other.gameObject.SetActive (false);
}
}
Answer by Chefsu · Apr 20, 2017 at 08:32 AM
This can be done with a delegate. More info about delegates can be found here.
public class PlayerController : MonoBehaviour
{
//Create a delegate and give it an int parameter
public delegate void OnCollect(int doorIndex);
public static OnCollect OnPlayerCollect;
private void OnTriggerEnter(Collider other)
{
int doorNumber = 0; //Check for itemindex (There are multiple ways to do that)
if (OnPlayerCollect != null) OnPlayerCollect(doorNumber); //Send a message to all the doors
}
}
Then create a Door script that listens to it and opens it when his door index gets called.
public class Door : MonoBehaviour
{
//Set in the editor
public int doorIndex;
private void Awake()
{
PlayerController.OnPlayerCollect += OpenDoor;
}
private void OnDestroy()
{
PlayerController.OnPlayerCollect -= OpenDoor;
}
private void OpenDoor(int index)
{
if(index == doorIndex)
{
//Open the door here
}
}
}
Your answer
Follow this Question
Related Questions
I need help with triggers 1 Answer
Script not recognizing collision 3 Answers
Multiple triggers on one object still a no? 1 Answer
Collider with trouble 1 Answer
Multiple Cars not working 1 Answer