- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
脚本有点长,也许我应该删除顶部的所有变量?该脚本为用户提供了与对象交互的选项。但即使我在编辑器中取消选中禁用脚本,然后运行游戏,我也可以与脚本附加到的对象进行交互。
只有当我先从编辑器中的对象中删除脚本然后运行游戏时,它才无法交互。
什么使脚本即使未经检查也能正常工作?
也许问题出在 FPEInteractableBaseScript 脚本中,因为 FPEInteractableActivateScript 是 FPEInteractableBaseScript 的类型?
using UnityEngine;
public class FPEInteractableActivateScript : FPEInteractableBaseScript
{
[SerializeField, Tooltip("If true, player can interact with this while holding something. If false, they cannot.")]
protected bool canInteractWithWhileHoldingObject = true;
[Header("Inventory Item Requirements (Optional)")]
[SerializeField, Tooltip("If true, activation will require an inventory item with the parameters as configured below")]
private bool requireInventoryItem = false;
public bool RequireInventoryItem { get { return requireInventoryItem; } }
[SerializeField, Tooltip("The type of inventory item required to activate")]
private FPEInventoryManagerScript.eInventoryItems requiredItemType = FPEInventoryManagerScript.eInventoryItems.APPLE;
public FPEInventoryManagerScript.eInventoryItems RequiredItemType { get { return requiredItemType; } }
[SerializeField, Tooltip("The quantity of inventory item required for the activation")]
private int requiredInventoryQuantity = 1;
public int RequiredInventoryQuantity { get { return requiredInventoryQuantity; } }
public enum eInventoryRequirementMode
{
IN_HAND = 0,
IN_INVENTORY = 1,
IN_HAND_OR_INVENTORY = 2
}
[SerializeField, Tooltip("Specify how the inventory item must be in player's possession for activation. Things like keycards might be required to be in hand, whereas a secret password written down on a scrap of paper can be in inventory or in hand.")]
private eInventoryRequirementMode requiredToBeInHand = eInventoryRequirementMode.IN_HAND_OR_INVENTORY;
public eInventoryRequirementMode RequiredToBeInHand { get { return requiredToBeInHand; } }
[SerializeField, Tooltip("If true, the activation will remove the item(s) once activation is triggered. (e.g. Remove battery when placed in radio. Don't remove keycard when swiped to open door.")]
private bool removeOnUse = false;
public bool RemoveOnUse { get { return removeOnUse; } }
[Header("Type of Activation and Events")]
[SerializeField, Tooltip("This will dictate the nature of the events. ONCE: Will only fire the first time. EVERYTIME: Will fire on every activation.")]
private FPEGenericEvent.eEventFireType eventFireType = FPEGenericEvent.eEventFireType.ONCE;
public FPEGenericEvent.eEventFireType EventFireType { get { return eventFireType; } }
[SerializeField, Tooltip("If using the EVERYTIME event fire type, set this time to some value (in seconds) which will suspend the interaction for that amount of time before the activation can be repeated. Not to be used as a replacement for complex state management.")]
private float eventRepeatDelay = 0.0f;
private float eventRepeatCounter = 0.0f;
private string previousInteractionString = "";
[Header("Shared 'Activation' and 'Toggle On' Event")]
[SerializeField, Tooltip("If specified, this event will fire on activation. It will adhere to defined occurrence type (e.g. fire once, fire every time, etc.)")]
private FPEGenericEvent ActivationEvent;
[Header("Shared 'Activation Failure' Event")]
[SerializeField, Tooltip("If specified, this event is fired when the player needs inventory to activate the object but does not have it. (e.g. beep and flash a 'keycard required' warning light)")]
private FPEGenericEvent ActivationFailureEvent;
[Header("TOGGLE-specific 'Toggle Off' Event")]
[SerializeField, Tooltip("If specified, this event will fire on de-activation or 'toggle off'.")]
private FPEGenericEvent DeactivationEvent;
[SerializeField, Tooltip("If true, toggling object OFF will also adhere to inventory requirements above")]
private bool toggleOffRequiresInventory = false;
public bool ToggleOffRequiresInventory { get { return toggleOffRequiresInventory; } }
[SerializeField, Tooltip("Overrides interaction string, and applied when toggle is currently OFF")]
private string toggleOnInteractionString;
[SerializeField, Tooltip("Overrides interaction string, and applied when toggle is currently ON")]
private string toggleOffInteractionString;
[SerializeField, Tooltip("If true, the toggle will toggle ON and fire the ToggleOnEvent when scene starts.")]
private bool toggleOnAtStart = false;
[SerializeField, Tooltip("If true, the toggle will toggle OFF and fire the ToggleOnEvent when scene starts.")]
private bool toggleOffAtStart = false;
[Header("Save Game Options")]
[SerializeField, Tooltip("If Event Fire Type is TOGGLE, and this value is true, the Toggle On and Toggle Off events will re-occur when game is loaded. For some objects like lights, a value of true is advised. For other objects like doors, a value of false makes more sense.")]
private bool fireToggleEventsOnLoadGame = true;
private bool toggleOn = false;
public bool IsToggledOn { get { return toggleOn; } }
private bool eventHasFiredOnce = false;
public override void Awake()
{
base.Awake();
interactionType = eInteractionType.ACTIVATE;
// You may want to override assigned Inspector value for canInteractWithWhileHoldingObject in child classes, depending on the object and use case
if (requireInventoryItem && requiredInventoryQuantity > 1 && requiredToBeInHand == eInventoryRequirementMode.IN_HAND)
{
Debug.LogError("FPEInteractableActivateScript:: Object '"+gameObject.name+"' is configured to require more than one '"+requiredItemType+"' but also that the '"+ requiredItemType + "'s are in player's hand. Player can only activate with one object in hand at a time. This activation will not work correctly.", gameObject);
}
else if (requireInventoryItem && requiredInventoryQuantity > 1 && requiredToBeInHand == eInventoryRequirementMode.IN_HAND_OR_INVENTORY)
{
Debug.LogWarning("FPEInteractableActivateScript:: Object '" + gameObject.name + "' is configured to require more than one '" + requiredItemType + "' but also that the '" + requiredItemType + "'s are in either in player's hand or in inventory. Player can only activate with one object in hand at a time. This activation may not work as expected.", gameObject);
}
if(toggleOnAtStart && toggleOffAtStart)
{
Debug.LogWarning("FPEInteractableActivateScript:: Object '" + gameObject.name + "' has both Toggle On At Start and Toggle Off At Start set to true.");
}
}
public override void Start()
{
base.Start();
// Some sanity checks if the wrong checkboxes are checked
if (eventFireType == FPEGenericEvent.eEventFireType.ONCE || eventFireType == FPEGenericEvent.eEventFireType.EVERYTIME)
{
if(DeactivationEvent.GetPersistentEventCount() != 0)
{
Debug.LogWarning("Object '"+gameObject.name+"' is of fire type '"+ eventFireType + "', but has a DeactivationEvent specified. This event will not fire unless you use TOGGLE type.", gameObject);
}
}
else if (eventFireType == FPEGenericEvent.eEventFireType.TOGGLE)
{
if (DeactivationEvent.GetPersistentEventCount() == 0)
{
Debug.LogWarning("Object '" + gameObject.name + "' is of fire type 'TOGGLE', but has no DeactivationEvent specified. Consider using a different type.");
}
}
if (eventFireType == FPEGenericEvent.eEventFireType.TOGGLE)
{
if (toggleOnAtStart)
{
doToggleOn();
}
if(toggleOffAtStart)
{
doToggleOff();
}
}
}
void Update()
{
if (eventFireType == FPEGenericEvent.eEventFireType.EVERYTIME && eventRepeatCounter > 0.0f)
{
eventRepeatCounter -= Time.deltaTime;
if (eventRepeatCounter <= 0.0f)
{
interactionString = previousInteractionString;
}
}
}
public override bool interactionsAllowedWhenHoldingObject()
{
return canInteractWithWhileHoldingObject;
}
public virtual void activate()
{
base.interact();
if (eventFireType == FPEGenericEvent.eEventFireType.ONCE)
{
if (!eventHasFiredOnce)
{
eventHasFiredOnce = true;
if (ActivationEvent != null)
{
ActivationEvent.Invoke();
}
}
}
else if (eventFireType == FPEGenericEvent.eEventFireType.EVERYTIME)
{
if (ActivationEvent != null && eventRepeatCounter <= 0.0f)
{
ActivationEvent.Invoke();
if (eventRepeatDelay > 0.0f)
{
eventRepeatCounter = eventRepeatDelay;
previousInteractionString = interactionString;
interactionString = "";
}
}
}
else if (eventFireType == FPEGenericEvent.eEventFireType.TOGGLE)
{
if (toggleOn)
{
doToggleOff();
}
else
{
doToggleOn();
}
}
else
{
Debug.LogWarning("FPEInteractableActivateGenericScript:: eventFireType '" + eventFireType + "' not yet implemented!");
}
#if UNITY_EDITOR
if (ActivationEvent.GetPersistentEventCount() == 0)
{
Debug.LogError("FPEInteractableActivateScript:: Object '" + gameObject.name + "' has no Activation Event assigned!", gameObject);
}
#endif
}
public void failToActivate()
{
if(ActivationFailureEvent != null)
{
ActivationFailureEvent.Invoke();
}
#if UNITY_EDITOR
if (ActivationFailureEvent.GetPersistentEventCount() == 0)
{
Debug.LogError("FPEInteractableActivateScript:: Object '" + gameObject.name + "' has no Activation Failure Event assigned! If this was intentional, you can ignore this error.", gameObject);
}
#endif
}
private void doToggleOn()
{
toggleOn = true;
interactionString = toggleOffInteractionString;
if (ActivationEvent != null)
{
ActivationEvent.Invoke();
}
#if UNITY_EDITOR
if (ActivationEvent.GetPersistentEventCount() == 0)
{
Debug.LogError("FPEInteractableActivateScript:: Object '" + gameObject.name + "' has no Activation Event assigned!", gameObject);
}
#endif
}
private void doToggleOff()
{
toggleOn = false;
interactionString = toggleOnInteractionString;
if (DeactivationEvent != null)
{
DeactivationEvent.Invoke();
}
#if UNITY_EDITOR
if (DeactivationEvent.GetPersistentEventCount() == 0)
{
Debug.LogError("FPEInteractableActivateScript:: Object '" + gameObject.name + "' has no Deactivation Event assigned!", gameObject);
}
#endif
}
#region GAME_SAVE_LOAD
public FPEActivateSaveData getSaveGameData()
{
// If we're in the middle of a repeat delay, save the previous interaction string so we don't load with a blank string :)
string interactionStringToSave = (interactionString == "" ? previousInteractionString : interactionString);
return new FPEActivateSaveData(gameObject.name, eventHasFiredOnce, toggleOn, interactionStringToSave);
}
public void restoreSaveGameData(FPEActivateSaveData data)
{
eventHasFiredOnce = data.FiredOnce;
toggleOn = data.ToggleCurrentlyOn;
interactionString = data.InteractionString;
if (eventFireType == FPEGenericEvent.eEventFireType.TOGGLE && fireToggleEventsOnLoadGame)
{
if (toggleOn)
{
doToggleOn();
}
else
{
doToggleOff();
}
}
}
#endregion
}
最佳答案
当您禁用脚本时,它只会禁用类似 Start
的功能, Update
, FixedUpdate
等(请参阅 documentation 中的完整列表)。另请参阅Behaviour.enabled其中说:
Enabled Behaviours are Updated, disabled Behaviours are not. This is shown as the small checkbox in the inspector of the behaviour.
这意味着如果在另一个脚本中您有:
GetComponent<FPEInteractableActivateScript>().activate();
activate
即使 FPEInteractableActivateScript
也会被调用已禁用。
另外,如果您有 activate
设置为按钮的处理程序,即使脚本被禁用,它也会被调用。
你能做的就是用 Behaviour.isActiveAndEnabled 来守护:
public virtual void activate()
{
if(!isActiveAndEnabled) return;
...
}
或者在调用之前检查游戏对象是否处于事件状态/脚本是否已启用,在本例中为激活。
关于c# - 为什么即使未选中禁用编辑器中的脚本,它仍然可以工作并使对象可交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60572757/
谁知道现成的脚本或插件提供: -Shift click for check/uncheck all in range -CTRL click to select or unselect all 这可以
如果您点击按钮,它会打开 3 个复选框(一个选择全部,还有两个子输入)。 我想做的是,如果用户点击Centro de dia,输入将保持选中状态,而另一个(在本例中为button)会被选中未经检查。如
我正在学习 Wes Bos 30 天 Javascript 类(class),在一项可选功能上,我需要在底部添加三个按钮:清除全部、选中全部和取消选中全部。这是代码
自从升级到 jquery 1.9 以来,我的脚本停止了检查/取消选中复选框的工作。 我有一个主复选框,用于控制选择/检查表中的复选框列表。升级到新的 jquery 版本后,仅最初单击“检查全部”复选框
我有一个带有复选框列的表格,我添加了以下内容: 这是我的 jQuery 函数: jQuery(document).ready(function() { jQuery('#selec
这是我所拥有的(此处使用 Twitter bootstrap) #html fdsfdsfds
这个问题已经有答案了: Setting "checked" for a checkbox with jQuery (44 个回答) 已关闭 6 年前。 当我单击“问题”时,必须选择/取消选择两个复选框
我有这个表格: First Second Third --- Option1 Option2 有没有办法(使用 JS/jQuery)我可以在 First 时将 first
我试图有一个复选框来选中/取消选中所有其他复选框。 我正在使用此代码: $("#checkall").toggle( function () { $(".kselItems
在复选框列表中,应该可以通过按下按钮来选中/取消选中所有项目。但是下面的代码只能部分工作: All None
当我执行代码时,我得到 4 个复选框,我检查/选择了所有 4 个复选框,当我尝试调试代码时,它确实算作我有 4 个复选框,但所有 4 个复选框都被选中 = false。 我在代码中缺少什么? Li
$("input[type='radio']").each(function() { if ($(this).is(":checked")) { $(this).css('backgrou
我无法使用此 javascript 函数。任何帮助将不胜感激! No function yesno(thecheckbox, thelabel){ var ch
这是我的第一个 js 脚本,请对我温柔点:) 问题是当我点击选中所有按钮时,所有复选框都被选中但它不会将值写入文本区域,如果我单击单个复选框然后值被添加/删除并且没关系,我只是卡住了在那个选中所有/取
我试图在复选框处于选中状态或未选中状态时传递一个值。 但是,它似乎没有通过非检查状态。我正在使用的代码如下: if (document.getElementById('PRODUCT_REVIEW_E
目前我正在使用它来选中/取消选中表单中的所有复选框。 checked=false; function checkedAll (frm1) { var aa= document.getElem
我有 2 个单选按钮,当我单击其中一个按钮时,我会看到下拉菜单,必须在其中选择金额。 到目前为止,我能够检查/取消检查它们,但问题是,当我取消检查单选按钮下拉列表时,不会再次隐藏。 我不太擅长 Jav
HTML: Select All 1. 2. 3. 4. 5. JS: function test(click
我需要为每套图书设置一个选中/取消选中全部复选框。它还应该加上总价和重量。到目前为止,我只能选中每个框,它会很好地添加值,但是一旦我添加一个函数来选中所有框,一切都会停止工作。 //check all
我正在尝试根据来自 mysql 数据库的数据来选中或取消选中复选框。我使用nusoap webservice/webclient读取数据,数据值可以是1或0。 我的代码是: functio
我是一名优秀的程序员,十分优秀!