我有一个碰撞脚本,我将布尔值设置为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:让布尔静态最初没有工作,但后来我意识到我必须在我的相机脚本中进行一些更改,所以它现在可以正常工作了,但菲利普说它是“sa”糟糕的建议 - 我个人不知道为什么,我认为它类似于使用!在CSS中很重要,你只是将它作为最后的手段,因为它使代码不那么灵活 - 所以我仍然愿意接受。
答案 0 :(得分:2)
您可能希望根据对象实例尝试对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
- 它只存在于实例化的对象上。
答案 1 :(得分:1)
如果您的相机需要访问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){
...
}
}
}
答案 2 :(得分:0)
您需要设置要从其他脚本(静态和公共)访问的变量。
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");
}
答案 3 :(得分:0)
我想建议一些方法,
谢谢,