Unity: transform.GetComponent Vs. GameObject.GetComponent?

I was wondering what the difference was between the transform and gameobject getcomponents.

I looked at this resource here: https://answers.unity.com/questions/1360282/what-is-the-difference-between-gameobjectgetcompon.html
【First of all understand the relationship between GameObject and Component.
A GameObject is a container; you add pieces to the GameObject container to make it into a character, a light, a tree, a sound, or whatever else you would like it to be. Each piece you add is called a component.

Depending on what kind of object you want to create, you add different combinations of components to a GameObject. You can think of a GameObject as an empty cooking pot, and components as different ingredients that make up your recipe of gameplay. Unity has lots of different built-in component types, and you can also make your own components.

GameObjects are all the same type.

Components come in many types.

GameObjects contain (instances of) components.

Every GameObject contains a Transform component.

Every component can access its gameObject.

Every component also get convenience accessors (properties) that retrieve the corresponding properties of its gameObject, including .transform, as you have observed.

Both the GameObject class and the Component class have a number of properties that are “shortcuts” to (other) components.

 myGameObject.transform is a shortcut for myGameObject.GetComponent<Transform>().
 myComponent.transform is a shortcut for myComponent.gameObject.GetComponent<Transform>()

the GetComponent function exists on the Component class as well. At the End both are same!!】

It states that: “At the end, both are the same”

Surely there must be a difference between the two?

ANSWER1:
They are equivalent.

Keep in mind Unity’s component-based architecture: almost everything that exists in the scene is a GameObject which usually has one or more Components attached to it. A Component must be attached to a GameObject in order to exist.

The GetComponent method, really an entire family of methods, allows scripts to look up references to specific Components.

If you call GetComponent on a GameObject (such as gameObject.GetComponent), it will find a matching Component attached to that GameObject.

If you call GetComponent on a Component (such as transform.GetComponent), it will find the GameObject that component is attached to, then find a matching Component attached to that GameObject. This is the same result, but it’s a convenient shorthand to save you the effort of putting gameObject references all over your scripts.

Technically these are separate methods, but the results and semantics are essentially identical. In practice you can use whichever form you are more comfortable with.

一,概述
   我们在monoDevelop中书写脚本语言时,GameObject与gameobject, Transform和transform是同时存在的如下图, 那么它们有什么区别和联系呢?
   1>GameObject与gameObject
   
   2>Transform与transform
   
二,GameObject与gameObject
      Gameobject是一个类型,所有的游戏物件都是这个类型的对象。
      gameobject是一个对象, 就跟java里面的this一样, 指的是这个脚本所附着的游戏物件
      示例:     
public class ShowSliderValue : MonoBehaviour
{
private GameObject obje; //定义GameObject类型的指针
void Start(){
Text lal =gameObject.GetComponent (); //通过gameObject获取到Text组件.
Debug.Log (“Text” + lal.text); //打印获取到组件的中的text的属性
}
}
打印结果:
  Text中的值
  
  输出台:

注意:
  Text  lal =gameObject.GetComponent () 中不使用gameObject , 直接通过GetComponent (),也是可以的.

三,Transform与transform
     Transform是一个类,用来描述物体的位置,大小,旋转等等信息。
     transform是Transform类的对象,依附于每一个物体。也是当前游戏对象的一个组件(每个对象都会有这个组件).
四,transform与gameObject
     1>二者的含义
        transform :  当前游戏对象的transform组件
    gameobject :当前游戏对象的实例
     2>两者的联系和区别
        * 在unity中每个游戏对象都是一个gameobject. monodevelop中的gameobject就代表着本脚本所依附的对象. 每个gameobject都包含各种各样的组件,但从这点可以看出transform是gameobject的一个组件,控制着gameobject的位置,缩放,和旋转,而且每个gameobject都有而且必有一个transform组件
        * gameobject.find用来获取场景中那个我们需要查找的对象(object)。而transform.find方法则是获取当前对象的子对象下我们需要获取的目标对象位置信息。
       
        * 注意:  在update()中尽量不使用find()方法,影响性能.
     3>gameobject.transform与transform.gameobject
        *  gameobject.transform,是获取当前游戏对象的transform组件.
            所以在start函数中 gameobject.transform 和this.transform,指向的都是同一个对象。即:gameobject.transform == this.transform == transform
        * transform.gameobject:可以这么理解为:获取当前transform组件所在的gameobect
           所以在start函数中()transform.gameobject == this.gameobject == gameobect
       示例:

public class ShowSliderValue : MonoBehaviour
{
private GameObject obje; //定义GameObject类型的指针
private Transform trans;//定义Transform类型的指针

void Start(){
	Debug.Log ("gameObject.name:" + gameObject.name);
	Debug.Log ("gameObject.transform.gameObject.name:" + gameObject.transform.gameObject.name);
	Debug.Log ("ThisGame.name:" + this.gameObject.name);
}

}
 打印结果:

点赞 8
————————————————
版权声明:本文为CSDN博主「等你左岸右岸」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lxl_815520/article/details/53638481

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
public void Move() { int stt = sun; scoreText.text = stt.ToString(); if (Input.GetKey(KeyCode.W)) { direction = 0; this.gameObject.GetComponent<SpriteRenderer>().sprite = prota[2]; this.gameObject.transform.Translate(Vector3.up * speed * Time.deltaTime); } else if (Input.GetKey(KeyCode.S)) { this.gameObject.GetComponent<SpriteRenderer>().sprite = prota[0]; direction = 2; this.gameObject.transform.Translate(Vector3.down * speed * Time.deltaTime); } else if (Input.GetKey(KeyCode.D)) { direction = 3; this.gameObject.GetComponent<SpriteRenderer>().sprite = prota[1]; this.gameObject.transform.Translate(Vector3.right * speed * Time.deltaTime); } else if (Input.GetKey(KeyCode.A)) { direction = 1; this.gameObject.GetComponent<SpriteRenderer>().sprite = prota[3]; this.gameObject.transform.Translate(Vector3.left * speed * Time.deltaTime); } // 播放脚步声 if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) { if (!audioSource.isPlaying) { audioSource.clip = footstepSound; audioSource.loop = true; audioSource.Play(); } } else { audioSource.Stop(); } // 攻击 if (Input.GetMouseButtonDown(0)) { // 处理鼠标左键点击事件 GameObject ins = Instantiate(bulletPrefab); Vector2 clickPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); ins.GetComponent<Blogs>().clickPosition = clickPosition; if (direction == 0) { ins.transform.position = new Vector3(this.gameObject.transform.position.x, this.gameObject.transform.position.y + 0.15f); } else if (direction == 2) { ins.transform.position = new Vector3(this.gameObject.transform.position.x, this.gameObject.transform.position.y - 0.15f); } else if (direction == 3) { ins.transform.position = new Vector3(this.gameObject.transform.position.x + 0.15f, this.gameObject.transform.position.y); } else if (direction == 1) { ins.transform.position = new Vector3(this.gameObject.transform.position.x - 0.15f, this.gameObject.transform.position.y); } } }public void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.tag == "GoldCoin") { Destroy(collision.gameObject); sun = sun + 1; if (!audioSource.isPlaying) { audioSource.clip = shique; audioSource.loop = true; audioSource.Play(); } } else { audioSource.Stop(); } //判断是否遭受攻击 if (collision.gameObject.tag == "zhi") { Destroy(collision.gameObject); hp = hp - 1; } // 检测碰撞物体的标签 if (collision.gameObject.tag == "zhi2") { // 忽略该碰撞 Physics2D.IgnoreCollision(collision.collider, GetComponent<Collider2D>()); } }优化代码
05-18
1. 将变量和函数命名规范化,遵循驼峰式命名法。 2. 将常量和不变的数值提取出来,定义为常量或静态变量。 3. 合理利用 Unity 引擎提供的功能,如使用 GetComponent 获取组件、使用 ScreenToWorldPoint 将屏幕坐标转换为世界坐标等。 4. 使用 switch 语句代替 if-else 语句,可以提高代码可读性和效率。 5. 在需要处理多个碰撞标签时,可以使用 switch-case 语句代替多个 if-else 语句。 修改后的代码如下: ```C# public class PlayerController : MonoBehaviour { private const float Speed = 5f; // 移动速度 private const int MaxHp = 5; // 最大生命值 private const float BulletOffset = 0.15f; // 子弹偏移量 [SerializeField] private AudioClip footstepSound; // 脚步声音效 [SerializeField] private AudioClip shique; // 收集金币音效 [SerializeField] private GameObject bulletPrefab; // 子弹预制体 [SerializeField] private Sprite[] prota; // 精灵数组 [SerializeField] private Text scoreText; // 分数文本 private AudioSource audioSource; // 音频源 private int hp = MaxHp; // 当前生命值 private int score; // 得分 private int direction; // 移动方向 private void Start() { audioSource = GetComponent<AudioSource>(); } private void Update() { Move(); Attack(); } private void Move() { scoreText.text = score.ToString(); Vector3 movement = Vector3.zero; if (Input.GetKey(KeyCode.W)) { direction = 0; GetComponent<SpriteRenderer>().sprite = prota[2]; movement = Vector3.up; } else if (Input.GetKey(KeyCode.S)) { direction = 2; GetComponent<SpriteRenderer>().sprite = prota[0]; movement = Vector3.down; } else if (Input.GetKey(KeyCode.D)) { direction = 3; GetComponent<SpriteRenderer>().sprite = prota[1]; movement = Vector3.right; } else if (Input.GetKey(KeyCode.A)) { direction = 1; GetComponent<SpriteRenderer>().sprite = prota[3]; movement = Vector3.left; } transform.Translate(movement * Speed * Time.deltaTime); PlayFootstepSound(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)); } private void PlayFootstepSound(bool isMoving) { if (isMoving && !audioSource.isPlaying) { audioSource.clip = footstepSound; audioSource.loop = true; audioSource.Play(); } else if (!isMoving) { audioSource.Stop(); } } private void Attack() { if (Input.GetMouseButtonDown(0)) { GameObject bullet = Instantiate(bulletPrefab); Vector2 clickPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); bullet.GetComponent<Bullet>().SetDirection(direction); bullet.transform.position = transform.position + BulletOffset * (Vector3)clickPosition.normalized; } } private void OnTriggerEnter2D(Collider2D other) { switch (other.tag) { case "GoldCoin": CollectCoin(other.gameObject); break; case "zhi": TakeDamage(1); break; } } private void OnTriggerStay2D(Collider2D other) { if (other.tag == "zhi2") { Physics2D.IgnoreCollision(other, GetComponent<Collider2D>()); } } private void CollectCoin(GameObject coin) { Destroy(coin); score++; audioSource.PlayOneShot(shique); } private void TakeDamage(int amount) { hp -= amount; if (hp <= 0) { Die(); } } private void Die() { Destroy(gameObject); // TODO: 处理玩家死亡逻辑 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值