2 shenhuan111 shenhuan111 于 2014.12.12 11:16 提问

c#中一个脚本调用另一个脚本的函数

除了public static外还用什么方法,可以的话,举一个简单的例子

6个回答

caozhy
caozhy   Ds   Rxr 2014.12.12 13:08
已采纳

不同的命名空间要先using
比如一个程序,这么写的
namespace WindowsFormApplication1
{
public class Form1 : Form
{
...
}
}
它要调用
namespace Library1
{
class Class1
{
public void 方法()
{
...
}
}
}
里面的函数,就需要带上命名空间:
在第一个代码头上加上
using Library1;

另一个就是static的函数用 类名.函数名
否则需要先实例化
Class1 c = new Class1();
c.方法();

除此之外也可以用委托

shenhuan111
shenhuan111 对了刚才忘记问了,写了Class1 c = new Class1();后有出现警告怎么回事,如何弄,才可以消除You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all
3 年多之前 回复
shenhuan111
shenhuan111 C++嗯的确是这样,好像有点明白了,呵呵帮大忙了
3 年多之前 回复
caozhy
caozhy C++也是这样,比如你不写using namespace std;你就要写std::cout,不能直接写cout。
3 年多之前 回复
caozhy
caozhy 显然,如果你需要调用10次,还是using简单,只要写一次。
3 年多之前 回复
caozhy
caozhy 回复shenhuan111: 命名空间不是必须要引用的。但是不同的两个命名空间,要调用对方的类,必须写成 命名空间.类 才能认。如果你想直接写 类名,那么必须using
3 年多之前 回复
shenhuan111
shenhuan111 对了C#中不用这个命名空间,好像可以直接使用另一个类的来创建对象??
3 年多之前 回复
shenhuan111
shenhuan111 嗯明白了,thank you
3 年多之前 回复
caozhy
caozhy 因为成员的初始化顺序是不确定的,这么写的结果难以预期,所以C#不允许在字段中通过调用成员方法返回值的形式给初始化值。
3 年多之前 回复
caozhy
caozhy 原因是,cs cs1=new cs();和int i=n.cshs();的执行顺序不确定。因为它是成员变量,不是函数中的语句。你觉得cs1先被初始化,才执行c.aa,但是编译器(假设这种写法合理)可能先调用的是c.aa
3 年多之前 回复
caozhy
caozhy 明白?
3 年多之前 回复
caozhy
caozhy 不能在字段中通过调用成员方法返回值的形式给初始化值。
3 年多之前 回复
shenhuan111
shenhuan111 什么原因
3 年多之前 回复
shenhuan111
shenhuan111 是如果class c=new class1; int i=c.aa();在函数外用会报A field initializer cannot reference the nonstatic field, method, or property `csmouspo.n报这样的错误,什么地方写错了还是??
3 年多之前 回复
caozhy
caozhy 要么把GetComponent定义成静态的,要么在构造函数中初始化它。
3 年多之前 回复
shenhuan111
shenhuan111 不好啥意思不是这个写错了
3 年多之前 回复
caozhy
caozhy 回复shenhuan111: 不能在字段中通过调用成员方法返回值的形式给初始化值。
3 年多之前 回复
shenhuan111
shenhuan111 对了 A field initializer cannot reference the nonstatic field, method, or property `csmouspo.n报这样的错误,什么地方写错了还是?? public class csmouspo : MonoBehaviour { cs n=GameObject.Find("Cube").GetComponent<cs>(); int i=n.cshs(); } public class cs : MonoBehaviour { public int cshs() { return 1; } }
3 年多之前 回复
shenhuan111
shenhuan111 呵呵命名空间呀,这个我知道
3 年多之前 回复
guwei4037
guwei4037   Ds   Rxr 2014.12.12 11:19

啥意思?一个类中调用另一个类中的函数(方法)?直接实例化那个类然后调用就是了(new Class().Method()).

shenhuan111
shenhuan111 在另一个脚步用(A是其他脚步的)A a=new A();直接这样是吧,可是调用A中的public函数或成员会报错,A field initializer cannot reference the nonstatic field, method, or property
3 年多之前 回复
shenhuan111
shenhuan111 不过这两类是在不同的脚步中,这个实例化可以弄吗??调用public的函数好像报错
3 年多之前 回复
guwei4037
guwei4037 回复shenhuan111: 直接在你要使用的类里面,new那个类,直接调用就好了。
3 年多之前 回复
shenhuan111
shenhuan111 C#我不是很清楚,C++中 如果要使用另一个.cpp中的类可以使其包含#include “另一个.cpp的头文件.h",而在C#中如何实现这一效果,我是C#初学者,可能说的不是很清楚。
3 年多之前 回复
shenhuan111
shenhuan111   2014.12.12 11:24

C#我不是很清楚,C++中 如果要使用另一个.cpp中的类可以使其包含#include “另一个.cpp的头文件.h",而在C#中如何实现这一效果,我是C#初学者,可能说的不是很清楚。

nanjian011
nanjian011   2014.12.12 11:50

去接用对象,或用 static 函数的方法都可以

nanjian011
nanjian011 如果是静态函数,不能用对象去访问它,要用类名
3 年多之前 回复
shenhuan111
shenhuan111 在不同脚本中没有任何中介之类的 可以直接使用A a=new A();创建另一个脚本的类对象吗??不过创建后a. 结果无法调用函数,怎么回事??
3 年多之前 回复
shenhuan111
shenhuan111 回复nanjian011: 我没用静态函数,操作非静态类成员做 initialize,倒是用了函数操作静态成员
3 年多之前 回复
nanjian011
nanjian011 静态函数中不能给非静态的类成员做 initialize
3 年多之前 回复
nanjian011
nanjian011 回复shenhuan111: 它说你用了非静态的东西,你 check 一下你的 codes
3 年多之前 回复
shenhuan111
shenhuan111 当然除了设置成这种方法public staitic
3 年多之前 回复
shenhuan111
shenhuan111 在另一个脚步用(A是其他脚步的)A a=new A();直接这样是吧,可是调用A中的public函数或成员会报错,A field initializer cannot reference the nonstatic field, method, or property
3 年多之前 回复
shenhuan111
shenhuan111   2014.12.12 20:16

A field initializer cannot reference the nonstatic field, method, or property `csmouspo.n报这样的错误,什么地方写错了还是??

public class csmouspo : MonoBehaviour {
cs cs1=new cs();

    int i=n.cshs();

}

public class cs : MonoBehaviour {

    public int cshs()
    {
            return 1;
    }

}

nanjian011
nanjian011 如果是静态函数,不能用对象去访问它,要用类名
3 年多之前 回复
shenhuan111
shenhuan111 回复caozhy:谢谢!喔虽然c#可以在在类中初始化,这样写还是不可以的是吧,长知识了,原本C++中不可以在类中初始化的,C#又一个区别
3 年多之前 回复
caozhy
caozhy 不能在字段中通过调用成员方法返回值的形式给初始化值。
3 年多之前 回复
caozhy
caozhy 看上去cs cs1=new cs();int i=n.cshs();应该写在函数里面,你怎么直接写在类的定义里面了。
3 年多之前 回复
caozhy
caozhy   Ds   Rxr 2014.12.12 20:29

你不要用C++来理解C#,根本不是一个东西。比如说,C#允许你在两个源代码文件中定义一个类。
在第一个文件里面写
partial class A
{
int i;
}
在第二个文件里面写
partial class A
{
int j;
}
最终编译出来的只有一个类:
class A
{
int i;
int j;
}
那么我问你,你说i和j谁在前?这个根本不好说。

shenhuan111
shenhuan111 不过,谢谢帮忙回答了
3 年多之前 回复
shenhuan111
shenhuan111 我发现越学,前面有些东西越不懂了,呵呵
3 年多之前 回复
caozhy
caozhy 回复shenhuan111: C++就不懂了。
3 年多之前 回复
shenhuan111
shenhuan111 对了c++中如果 定义类成员 int i; int j;这个有前后之分吗?还是和C#一样
3 年多之前 回复
shenhuan111
shenhuan111 呵呵,开始学C#时,大家都说有C++基础学C#很容易,我看你是对的,C#用C++来理解,的确不太好,不过不用C++的思路来学,我还真无从下手了,学c#就像补洞一样,慢慢学,和区分与C++的不同了
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!