Unité: Une référence d'objet est requise pour accéder à la non-membre statique - Ray fonte à GameObject
Je suis en train de faire un RTS style de jeu et j'ai une erreur.
Je suis en train d'envoyer de l'actuelle unité de votre choix (l'objet le script est sur) pour le Meneur de jeu FSM de l'objet que le raycast frappé. J'ai réalisé que vous ne pouvez pas accéder gameobjects et se transforme à l'intérieur d'une fonction statique, donc j'ai essayé d'appeler une autre fonction pour utiliser le frapper et de remplir le gameobject variable.
C'est l'erreur:
Assets/Scripts/Unit.cs(57,41): error CS0120: An object reference is required to access non-static member `Unit.SetOurObject(UnityEngine.RaycastHit)'
La question principale je pense, c'est ici:
public static Vector3 GetDestination()
{
if (moveToDestination == Vector3.zero)
{
RaycastHit hit;
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(r, out hit))
{
while (!passables.Contains(hit.transform.gameObject.name))
{
if (!Physics.Raycast(hit.transform.position, r.direction, out hit)) //point + r.direction * 0.1f
break;
}
//gameObject.GetComponent<NavMeshAgent>().SetDestination(hit.point);
//if (hit.transform != null){
//print (hit);
if (resources.Contains(hit.transform.gameObject.name)){
SetOurObject(hit);
//SelectedUnit.Value = GameObject.name;
//ResourceHit.Fsm.Event("startHit");
} else {
moveToDestination = hit.point;
}
//}
}
}
return moveToDestination;
}
public void SetOurObject(RaycastHit hitRay)
{
ourObject = hitRay.transform.gameObject;
PlayMakerFSM ourFSM = ourObject.GetComponent<PlayMakerFSM>();
FsmGameObject SelectedUnit = ourFSM.FsmVariables.GetFsmGameObject("SelectedUnit");
SelectedUnit.Value = new GameObject();
ourFSM.Fsm.Event("ResourceHit");
}
Et voici le script en entier:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using HutongGames.PlayMaker;
public class Unit : MonoBehaviour {
public PlayMakerFSM ResourceHit;
public GameObject ourObject;
public bool selected = false;
private Color SelectedCol = new Color(0.114f, 0.22f, 0.039f, 1.0f);
private Color UnselectedCol = new Color(0.357f, 0.604f, 0.184f, 1.0f);
private bool selectedByClick = false;
private Vector3 moveToDest = Vector3.zero;
private static Vector3 moveToDestination = Vector3.zero;
private static List<string> passables = new List<string>() { "Floor" };
private static List<string> resources = new List<string>() { "Res_Wood" };
//Update is called once per frame
private void CleanUp()
{
if (!Input.GetMouseButtonUp(1))
moveToDestination = Vector3.zero;
}
private NavMeshAgent agent;
void Start() {
agent = GetComponent<NavMeshAgent>();
}
public static Vector3 GetDestination()
{
if (moveToDestination == Vector3.zero)
{
RaycastHit hit;
Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(r, out hit))
{
while (!passables.Contains(hit.transform.gameObject.name))
{
if (!Physics.Raycast(hit.transform.position, r.direction, out hit))
break;
}
if (resources.Contains(hit.transform.gameObject.name)){
SetOurObject(hit);
} else {
moveToDestination = hit.point;
}
}
}
return moveToDestination;
}
public void SetOurObject(RaycastHit hitRay)
{
ourObject = hitRay.transform.gameObject;
PlayMakerFSM ourFSM = ourObject.GetComponent<PlayMakerFSM>();
FsmGameObject SelectedUnit = ourFSM.FsmVariables.GetFsmGameObject("SelectedUnit");
SelectedUnit.Value = new GameObject();
ourFSM.Fsm.Event("ResourceHit");
}
void Update () {
CleanUp();
if (this.GetComponent<Renderer>().isVisible && Input.GetMouseButton(0))
{
if (!selectedByClick){
Vector3 camPos = Camera.main.WorldToScreenPoint(transform.position);
camPos.y = CameraOperator.InvertMouseY (camPos.y);
selected = CameraOperator.selection.Contains(camPos);
}
if (selected)
this.GetComponent<Renderer> ().material.color = UnselectedCol;
else
this.GetComponent<Renderer> ().material.color = SelectedCol;
}
if (selected && Input.GetMouseButtonUp(1))
{
Vector3 destination = GetDestination();
if (destination != Vector3.zero)
{
gameObject.GetComponent<NavMeshAgent>().SetDestination(destination); //all you need if you have unity pro
//moveToDest = destination;
//moveToDest.y += floorOffset;
}
}
}
private void OnMouseDown()
{
selectedByClick = true;
selected = true;
}
private void OnMouseUp()
{
if (selectedByClick)
selected = true;
selectedByClick = false;
}
}
}
Merci d'avance! =)
- N'utilisez pas l'unité de la balise pour les questions de moteur de jeu Unity3d. Il y a unity3d balise pour que.
- Mes excuses pour ce que, je ne savais pas
Vous devez vous connecter pour publier un commentaire.
Même si Christos est juste à propos de la
why
elle lève une exception (que vous essayez d'accéder à une méthode d'instance comme si c'était une méthode statique), il manque un détail.Dans Unity3D vous ne pouvez pas instancier (facilement) des classes qui implémentent MonoBehaviour. Vous créez par la fixation d'un composant de script existant gameobjects et vous pouvez y faire référence dans le code.
Donc, pour résoudre ce problème, si vous voulez appeler cette méthode, vous devez d'abord obtenir une référence à l'attaché de composant de script qui est dans la Scène et alors vous pouvez le faire.
Exemple Simple, disons que le composant de script est connectée à l'Unité même GameObject, vous référence comme ceci:
À partir du message d'erreur que vous avez, il est clair que la méthode
SetOurObject(UnityEngine.RaycastHit)
n'est pas un
static
la méthode de la classeUnit
.Par conséquent, vous devez d'abord créer une instance de cette classe et après cet appel de cette méthode.
Vous pouvez ensuite appeler la méthode à l'aide de cet objet.
SetOurObject
est une méthode de laUnit
classe. - Il Correct? Si donc, comme il semble être, et compte tenu du fait que n'est pas unstatic
méthode, vous pouvez l'utiliser de cette façon:Static.SetOurObject(UnityEngine.RaycastHit)
, comme nous le faisons dans le cas deWriteLine
méthode deConsole
classe,Console.WriteLine
. Il faut tout d'abord créer une instance de la classeUnit
et faire ensuite appel à cet objet de cette méthode. Est plus clair maintenant?ClassName.Method()
. Il n'y a pas le concept de la dynamique de la méthode autant que je suis conscient de. Donc, si votre question est de savoir si vous pouvez modifier leGetDestination
destatic
non statique, à une méthode d'instance, ma réponse est oui. Vous pouvez le faire, dans la mesure qui répond à vos besoins.