从c#中的另一个类访问布尔值

本文关键字:访问 布尔值 另一个 | 更新日期: 2023-09-27 18:18:26

我有一个冲突脚本,其中我将布尔值设置为true或false

using UnityEngine;
using System.Collections;
public class IsTriggerLockCamera : MonoBehaviour {
    public bool CameraLock = false;
    public void OnTriggerStay2D(Collider2D other) {
        CameraLock = true;
        Debug.Log ("Im inside"); 
    }
        public void OnTriggerExit2D(Collider2D other) {
        CameraLock = false;
        Debug.Log ("I exited");
    }

}

我想从我的相机脚本访问这个布尔值,我试过这个

if (CameraLock == true) {
            Debug.Log ("Im locked");
        }

然而,我得到一个错误说CameraLock不存在于当前上下文中。布尔值是公共的,所以我很困惑


编辑:我觉得我没有给出足够好的信息,所以我将从发布整个相机脚本开始,然后澄清。

using System;
using UnityEngine;
    public class CameraFollowLockY : MonoBehaviour
    {
        public Transform target;
        public float damping = 1;
        public float lookAheadFactor = 3;
        public float lookAheadReturnSpeed = 0.5f;
        public float lookAheadMoveThreshold = 0.1f;
        private float m_OffsetZ;
        private Vector3 m_LastTargetPosition;
        private Vector3 m_CurrentVelocity;
        private Vector3 m_LookAheadPos;
        private void Start()
        {
            m_LastTargetPosition = target.position;
            m_OffsetZ = (transform.position - target.position).z;
            transform.parent = null;
        }

        private void Update()
        {
            float xMoveDelta = (target.position - m_LastTargetPosition).x;
            bool updateLookAheadTarget = Mathf.Abs(xMoveDelta) > lookAheadMoveThreshold;
            if (updateLookAheadTarget)
            {
                m_LookAheadPos = lookAheadFactor*Vector3.right*Mathf.Sign(xMoveDelta);
            }
            else
            {
                m_LookAheadPos = Vector3.MoveTowards(m_LookAheadPos, Vector3.zero, Time.deltaTime*lookAheadReturnSpeed);
            }
            Vector3 aheadTargetPos = target.position + m_LookAheadPos + Vector3.forward*m_OffsetZ;
            Vector3 newPos = Vector3.SmoothDamp(transform.position, aheadTargetPos, ref m_CurrentVelocity, damping);
            transform.position = newPos;
            transform.position = new Vector3(transform.position.x, 0, transform.position.z);
            m_LastTargetPosition = target.position;

        if (CameraLock == true) {
            Debug.Log ("Im locked");
        }
}

IsTriggerLockCamera是我在Unity中用于隐形碰撞器的脚本。我的摄像机始终聚焦在玩家身上,但我希望它在玩家接近地图边缘时停止移动,这样他就能注意到地图即将结束。最初的计划是,当玩家进入对撞机时,对撞机将发送信息,而不是Debug.Log ("Im Locked");,而是一些将相机锁定在适当位置的代码。我不知道这个解决方案是否非常优雅,我想为没有事先澄清一切而道歉,但我大约2个月前开始编码(我只做Rails网站),我大约一周前进入c#游戏开发,所以我仍然缺少正确描述我遇到的问题所需的术语。到目前为止,没有任何建议奏效。最接近可行的建议是OnoSendai的建议,但显然不允许使用"new"创建MonoBehaviour。


Edit2:使布尔静态不工作,但后来我意识到我不得不作出一些改变,在我的相机脚本,所以现在的作品,但菲利普表示,这是一个不好的建议——我不知道为什么,我认为这是喜欢使用!重要的CSS,你就用它作为最后的手段,因为它使代码不灵活,所以我仍然开放的想法。

从c#中的另一个类访问布尔值

您可能想尝试基于对象实例的CameraLock属性的完整引用-如

    var objRef = new IsTriggerLockCamera(); // Just an example of object reference - 
                                            // You may already have one
                                            // on your code.
    if (objRef.CameraLock) {
        Debug.Log ("Im locked");
    }

这是因为CameraLock被标记为public,而不是static -它只存在于实例化的对象上。

如果您的相机需要访问IsTriggerLockCamera,那么依赖注入是使其清晰的好方法:

class Camera{
    private readonly IsTriggerLockCamera _locker;
    public Camera(IsTriggerLockCamera locker){
       if (locker== null)
       {
           throw new ArgumentNullException("locker");
       }
       _locker = locker;
    }
    public void whatevermethod(){
        if (_locker.CameraLock){
           ...
        } 
    }
}

您需要设置要从其他脚本访问的变量,无论是静态的还是公共的。

using UnityEngine;
using System.Collections;
public class IsTriggerLockCamera : MonoBehaviour {
public static bool CameraLock = false;
public void OnTriggerStay2D(Collider2D other) {
    CameraLock = true;
    Debug.Log ("Im inside"); 
}
    public void OnTriggerExit2D(Collider2D other) {
    CameraLock = false;
    Debug.Log ("I exited");
}

}

则可以访问CameraLock:

if (CameraLock == true) {
        Debug.Log ("Im locked");
    }

我想建议一些方法,

  1. 设置CameraLock变量为protected
  2. 创建一个新类,并使IsTriggerLockCamera类作为基类。
  3. 使用CameraLock变量并对其进行处理。

谢谢,

c#有一个函数叫做{get;设置可以与变量

一起使用的}

这个程序是一个例子

静态类型

public static class AYO
{
    public static string Variable1 { get; set; }
}
public class B
{
    
    public void LOL()
    {
        string foo;
        AYO.Variable1 = "Variable is now set";
        foo = AYO.Variable1;
        Console.WriteLine(foo);
    }
    
}
非静态

public class AYO
{
    public string Variable1 { get; set; }
}
public class B
{
    AYO ayo = new AYO();
    public void LOL()
    {
        string foo;
        ayo.Variable1 = "Variable is now set";
        foo = ayo.Variable1;
        Console.WriteLine(foo);
    }
    
}