[英]How can I get access of a enum in a script from another script?
The script with the enum:带有枚举的脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class InteractableItem : MonoBehaviour
{
public enum InteractableMode // your custom enumeration
{
Description,
Action
};
public InteractableMode interactableMode = InteractableMode.Description;
public float distance;
private bool action = true;
[TextArea(1, 10)]
public string description = "";
public void ActionOnItem()
{
if(interactableMode == InteractableMode.Action && distance <= 5f && action == true)
{
action = false;
}
}
}
and the script I'm trying to access from:和我试图访问的脚本:
using UnityEngine;
using System;
using System.Collections;
using UnityEngine.UI;
using System.Collections.Generic;
[RequireComponent(typeof(Animator))]
public class IKControl : MonoBehaviour
{
public InteractableItem[] lookObj = null;
public GameObject objToThrow;
public Text text;
public Text textMultiLine;
public float weightDamping = 1.5f;
public float maxDistance = 10f;
public bool RightHandToTarget = true;
public float throwSpeed;
private List<InteractableItem> allDetectedItems;
private Animator animator;
private InteractableItem lastPrimaryTarget;
private Quaternion savedRotation;
private float lerpEndDistance = 0.1f;
private float finalLookWeight = 0;
private bool transitionToNextTarget = false;
private InteractableItem target;
private bool throwObj = false;
void Start()
{
animator = GetComponent<Animator>();
allDetectedItems = new List<InteractableItem>();
}
// Callback for calculating IK
void OnAnimatorIK()
{
if (lookObj != null)
{
InteractableItem primaryTarget = null;
float closestLookWeight = 0;
// Here we find the target which is closest (by angle) to the players view line
allDetectedItems.Clear();
foreach (InteractableItem target in lookObj)
{
Vector3 lookAt = target.transform.position - transform.position;
lookAt.y = 0f;
// Filter out all objects that are too far away
//if (lookAt.magnitude > maxDistance) continue;
if (lookAt.magnitude > target.distance) continue;
float dotProduct = Vector3.Dot(new Vector3(transform.forward.x, 0f, transform.forward.z).normalized, lookAt.normalized);
float lookWeight = Mathf.Clamp(dotProduct, 0f, 1f);
if (lookWeight > 0.1f && lookWeight > closestLookWeight)
{
closestLookWeight = lookWeight;
primaryTarget = target;
allDetectedItems.Add(target);
}
}
if (primaryTarget != null)
{
if ((lastPrimaryTarget != null) && (lastPrimaryTarget != primaryTarget) && (finalLookWeight > 0f))
{
// Here we start a new transition because the player looks already to a target but
// we have found another target the player should look at
transitionToNextTarget = true;
}
}
// The player is in a neutral look position but has found a new target
if ((primaryTarget != null) && !transitionToNextTarget)
{
lastPrimaryTarget = primaryTarget;
//finalLookWeight = Mathf.Lerp(finalLookWeight, closestLookWeight, Time.deltaTime * weightDamping);
finalLookWeight = Mathf.Lerp(finalLookWeight, 1f, Time.deltaTime * weightDamping);
float bodyWeight = finalLookWeight * .75f;
animator.SetLookAtWeight(finalLookWeight, bodyWeight, 1f);
animator.SetLookAtPosition(primaryTarget.transform.position);
if (RightHandToTarget)
{
Vector3 relativePos = primaryTarget.transform.position - transform.position;
Quaternion rotationtoTarget = Quaternion.LookRotation(relativePos, Vector3.up);
animator.SetIKRotationWeight(AvatarIKGoal.RightHand, finalLookWeight);
animator.SetIKRotation(AvatarIKGoal.RightHand, rotationtoTarget);
animator.SetIKPositionWeight(AvatarIKGoal.RightHand, finalLookWeight * 1f * closestLookWeight);
animator.SetIKPosition(AvatarIKGoal.RightHand, primaryTarget.transform.position);
// -> new code block
if (finalLookWeight > 0.95f) // here you can play with a value between 0.95f -> 1.0f
{
// call your funtion to shoot something here
throwObj = true;
target = primaryTarget;
}
}
}
// Let the player smoothly look away from the last target to the neutral look position
if ((primaryTarget == null && lastPrimaryTarget != null) || transitionToNextTarget)
{
finalLookWeight = Mathf.Lerp(finalLookWeight, 0f, Time.deltaTime * weightDamping);
float bodyWeight = finalLookWeight * .75f;
animator.SetLookAtWeight(finalLookWeight, bodyWeight, 1f);
animator.SetLookAtPosition(lastPrimaryTarget.transform.position);
if (RightHandToTarget)
{
Vector3 relativePos = lastPrimaryTarget.transform.position - transform.position;
Quaternion rotationtoTarget = Quaternion.LookRotation(relativePos, Vector3.up);
animator.SetIKRotationWeight(AvatarIKGoal.RightHand, finalLookWeight);
animator.SetIKRotation(AvatarIKGoal.RightHand, rotationtoTarget);
animator.SetIKPositionWeight(AvatarIKGoal.RightHand, finalLookWeight * 0.5f * closestLookWeight);
animator.SetIKPosition(AvatarIKGoal.RightHand, lastPrimaryTarget.transform.position);
}
if (finalLookWeight < lerpEndDistance)
{
transitionToNextTarget = false;
finalLookWeight = 0f;
lastPrimaryTarget = null;
}
}
// Show primary object found by the player
if (primaryTarget != null) text.text = "Item found: " + primaryTarget.description;
else text.text = "Item found: none";
// Show all objects found by the player
if (allDetectedItems.Count > 0)
{
string result = "";
foreach (InteractableItem item in allDetectedItems)
{
result += item.description + "\n";
}
textMultiLine.text = result;
}
else
{
textMultiLine.text = "No items found.";
}
}
}
private void ThrowObject()
{
if(target.interactableMode.)
objToThrow.transform.position = Vector3.MoveTowards(objToThrow.transform.position, target.transform.position, throwSpeed * Time.deltaTime);
}
private void Update()
{
if (throwObj == true)
{
ThrowObject();
}
}
}
At the bottom in the method ThrowObject I want it to throw the object only if the object enum mode is set to Action:在方法 ThrowObject 的底部,我希望它仅在 object 枚举模式设置为 Action 时抛出 object:
private void ThrowObject()
{
if(target.interactableMode.)
objToThrow.transform.position = Vector3.MoveTowards(objToThrow.transform.position, target.transform.position, throwSpeed * Time.deltaTime);
}
The problem is I have a access to the variable target.interactableMode in the IF but not to the enum it self.问题是我可以访问 IF 中的变量 target.interactableMode 但不能访问它自己的枚举。 I want to check if the target is in action mode then throw the object.我想检查目标是否处于动作模式,然后抛出 object。
The enum is inside a class, so to call her, you have to call the class first, then the enum: YourClass.YourEnum枚举在 class 里面,所以要给她打电话,你必须先打电话给 class,然后是枚举:YourClass.YourEnum
In your case: InteractableItem.InteractableMode在你的情况下:InteractableItem.InteractableMode
And for access a value in this enum: InteractableItem.InteractableMode.Action为了访问此枚举中的值:InteractableItem.InteractableMode.Action
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.