为了账号安全,请及时绑定邮箱和手机立即绑定

Unity C# 类和对象

Unity C# 类和对象

C#
墨色风雨 2021-11-21 11:01:21
下车,我很抱歉这将是一个相当愚蠢的问题,但我正在努力全面了解对象的目的和用途。具体来说,我在 Unity 工作,但我不确定这是否重要。另外,我还应该提到语言是相当压倒性的。但这是我正在处理的简单示例。public class Player : MonoBehaviour {    private string name = "Players Name";    private void Start () {        var nexus = new Player();    }    public static void Using() {        // how are these different?        Attack();        this.Attack();    }    public static void Move() {        print ("The player is moving");     }    private void Attack () {        print ("The player is attacking");     }}public class UsingStuff : MonoBehaviour {    private void Start () {        Player.Move();    }}所以这里是问题:调用函数 Attack() 和 this.Attack 有什么区别?从新手的角度来看,他们似乎做完全相同的事情。然而,我假设我的例子太简单了。我使用随机名称 nexus 创建了 Player 类的对象。但是,当我从不同的类调用函数时,我似乎使用了类名而不是这个变量名。那么创建变量名的目的是什么?我暂时将它放在这两个上,希望这将有助于解决其他一些问题。感谢您的帮助。
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

调用函数 Attack() 和 this.Attack 有什么区别?


例如,当您编写类 Player 并且想要使用方法“Attack()”时,您可以通过键入 Attack() 或 this.Attack() 来实现。它在两种情况下都做同样的事情。


当你使用“这个”时。你保证你使用的方法是在你所在的类上实现的。例如:


public void GroupAttack(DifferentPlayer ally){

    Attack(); 

    ally.Attack();

}


public void GroupAttackWithThis(DifferentPlayer ally){

    this.Attack(); 

    ally.Attack();

}

GroupAttack 和 GroupAttackWithThis 方法之间没有区别。


我使用随机名称 nexus 创建了 Player 类的对象。但是,当我从不同的类调用函数时,我似乎使用了类名而不是这个变量名。那么创建变量名的目的是什么?


发生这种情况是因为您将函数“Move”设为静态,这意味着对于该类的每个实例,它都会执行完全相同的操作。当您希望一个方法或一个变量对于类的每个实例每次都具有相同的值或具有相同的行为时,使用静态。如果您的方法不是静态的,您将需要使用变量的名称来使用它,那是因为您希望您的方法为每个实例更改他的行为。一个简单的例子:


public string GetName(){

    return name;

}

此方法将为每个玩家返回一个不同的名称(将在变量中返回玩家的名称)。所以如果你这样做:


Player jhon = new Player();

jhon.name = "Jhon";

String jhonsName = jhon.GetName();

变量“jhonsName”将包含一个值为“Jhon”的字符串。


我希望这对您有用,并祝您游戏愉快。


查看完整回答
反对 回复 2021-11-21
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

Unity MonoBehaviour 与普通 C# 类之间存在一些差异。我建议观看一些 Unity 教程。Unity 脚本是面向场景的。

  1. 没有区别。this.Something可用于将某物标记为“来自类对象”(通常为属性或变量)以与参数区分开来。

  2. 编写Player nexus = new Player(); 应该是警告,因为您不应该使用 MonoBehaviour 执行此操作。

您可以通过将脚本“播放器”放在游戏对象上来在场景中创建播放器。您应该从 GameObject 访问 Player 脚本。所以你应该删除方法上的“静态”。然后放公共Player播放器;在 UsingStuff 内部(在公共类 UsingStuff 下:MonoBehaviour {)。然后将您的播放器拖到播放器的占位符上。您将在场景中使用 UsingStuff-Script 的 GameObject 上找到它。现在您可以在 Start 方法中调用 player.Move()(带有小 p)。

为您的变量名称尝试另一种命名方式。它已经存在于每个 MonoBehaviour 中。它指的是脚本所在的游戏对象的名称。您的命名也应该抛出一个警告。


查看完整回答
反对 回复 2021-11-21
?
慕容森

TA贡献1853条经验 获得超18个赞

执行时Player nexus = new Player();,您正在创建类型 (/class)“Player”的新实例 (/object)。该变量nexus是一个对象引用(即,它指的是您刚刚创建的对象实例)。一旦你有了一个实例,你就可以在那个对象上调用实例方法,设置或读取它的属性(顺便说一下,你没有)。由于对该对象(nexus变量)只有一个引用,当该引用超出范围(在函数结束时)时,该对象不再被任何对象引用并且有资格进行垃圾回收。

当您使用static关键字声明一个方法 (/function) 时,您是在类级别而不是在实例级别创建它。如果你想调用非静态的UpdateorAttack方法,你必须说nexus.Updateor nexus.Attack。要调用静态UsingMove方法,您可以使用类名 (Player),如下所示:Player.UsingPlayer.Move

您发布的代码无法编译,是吗?您不能从静态方法调用实例方法。您不能调用实例方法Attackthis.Attack静态方法Using(那里没有“this”(this是与实例方法关联的当前对象实例))。最好发布至少可以编译的代码(除非你说(在评论中)//this is the code that doesn't compile

您还只在Start方法中创建了一个新的 Player 实例,这有点奇怪。通常,您在其他类或静态工厂方法中创建对象的实例(并非总是如此,但通常如此)。

阅读面向对象编程的本质、C# 的static关键字和对象实例的本质(一般而言)。您可能还想阅读 C# 的属性。

哦,Using从长远来看,命名某些东西会受到伤害(小写using是一个 C# 关键字,已经有两个含义)。

最后,回答你的问题,“以这种方式调用实例方法:Attack()或那样:this.Attack()具有相同的语义。” 当然,如上所述,如果您尝试从静态方法调用实例方法,则不能使用任何一种形式。


查看完整回答
反对 回复 2021-11-21
  • 3 回答
  • 0 关注
  • 164 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信