我正在使用unity 5.5,我遇到了这个问题。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WhatTheHell : MonoBehaviour
{
public static int testVal;
void Awake()
{
SetVal(testVal);
Debug.Log(testVal);
}
void SetVal(int val)
{
val = 10;
}
}
调试结果为0,为什么?
答案 0 :(得分:3)
您可以通过从函数中创建全局变量,参考关键字或简单返回int ,以多种方式执行此操作。如描述
全局变量
public static int testVal=0;
void Awake()
{
SetVal();
Debug.Log(testVal); // print 10
}
void SetVal()
{
testVal = 10;
}
参考关键字
public static int testVal=0;
void Awake()
{
SetVal(ref testVal);
Debug.Log(testVal); // print 10
}
void SetVal(ref int testVal)
{
testVal = 10;
}
return int
public int testVal=0;
void Awake()
{
testVal = SetVal();
Debug.Log(testVal); // print 10
}
int SetVal()
{
return 10;
}
答案 1 :(得分:2)
在这里,您将testVal
定义为static
,以便它可以在类中的所有方法中使用(您也可以通过类名{{1}访问类外的类) })。所以实际上在这种情况下不需要传递变量。
然后,您将变量WhatTheHell.testVal
作为pass by值传递给testVal
方法,因此它将仅传递值而不是实际变量。这就是改变不反映实际变量的原因。
以下代码将按预期运行:
SetVal()
有关更详细的说明和示例,您可以查看Ehsan Sajjad的Story of Pass By Value and Pass By Reference in C#。
答案 2 :(得分:2)
问题是int是值类型而不是引用类型。
当你将'testVal'传递给'SetVal()'时,它会将'testVal'的值复制到'val'中,仅用于方法范围。
如果使用关键字ref,则'val'参数将作为引用类型处理
void SetVal(ref int val)
SetVal(ref testVal);
有关价值和参考类型的更多信息,请访问:https://msdn.microsoft.com/en-us/library/9t0za5es.aspx
答案 3 :(得分:0)