unity點用gameObject名揾component?

欲邀重生

22 回覆
4 Like 3 Dislike
欲邀重生 2024-06-03 16:41:03
我整緊隻遊戲,入面有唔同種類嘅敵人
每種敵人有一張同自己gameObject同名嘅script,記載各自嘅招式
然後所有敵人共用一張叫enemy_ai嘅script,控制幾時出招

例如gameObject dragon入面有 script dragon 同 script enemy_ai
我想喺enemy_ai call dragon入面嘅function

dragon入面嘅function叫fire():


喺enemy_ai call fire():


上面用咗兩種方法
myComponentA 係用 dragon class名開嘅variable,用class名GetCompenent成功call到function

但係由於唔同類種嘅敵人都共用同一張enemy_ai,所以我唔可以直接用class名GetCompenent
myComponentB就係試緊用gameObject名揾佢張同名script
但係call唔到function:


如果用mouse指住myComponentA ,系統知道myComponentA 屬於dragon class。但指住myComponentB就唔知

所以我估問題係系統唔知myComponentB屬於dragon class
但我將class名儲係string myName到,唔知將myComponentB變成dragon class

我搞咗成日,試過加as MonoBehaviour之類方法都搞唔到
https://discussions.unity.com/t/getcomponent-via-string-name/129412/4
有冇人知點做
2015 2024-06-03 16:57:14
正常都用方法一
方法二就算得
點解Script Component 個名會喺gameObject.name?

btw 我估你想寫個系統係每個gameObject eg: dragon, 都有一個叫同名既script eg: "dragon" 既script, 然後battle就係通用咁call返全部唔同既gameObject script?
欲邀重生 2024-06-03 17:53:01
為咗方法揾,所以將Script Component名改到同gameObject名一樣
例如gameObject dragon入面有Script dragon
gameObject tRex入面有Script tRex
咁大家共用同一張script enemy_ai,只要行this.gameObject.name就可以揾到各自嘅gameObject同script

btw 我估你想寫個系統係每個gameObject eg: dragon, 都有一個叫同名既script eg: "dragon" 既script, 然後battle就係通用咁call返全部唔同既gameObject script?


因為每種敵人要識判斷幾時接近玩家,幾時攻擊,幾時逃走。依堆code每種敵人都一樣,所以想用一張enemy_ai儲起大家一齊用
然後每種敵人嘅攻擊招式都有分別,所以要各自有一張專屬嘅script儲招式
enemy_ai 判斷應該進攻(battle)時,就call專屬script嘅招式

其實依家只係差少少,係差variable myComponentB放唔到入dragon class
依家研緊MonoBehaviour基類子類嗰啲,唔知幫唔幫到手

如果都係做唔到,用方法一就要每種敵人重複寫一張自己嘅ai
雖然易啲,但好似多好餘
欲邀重生 2024-06-03 17:54:10
為咗容易啲揾,所以將Script Component名改到同gameObject名一樣
真心膠萬能俠 2024-06-03 18:39:17
我會話用GameObject嘅Name去搵Component哩個方法本身就唔係一個好方法 唔太穩定 而且好唔方便
例如你用 Instantiate 去生成prefab嘅時候唔特登改名個GameObject嘅Name後面會有(instantiate)之類 咁你就會揾唔到
而且每個敵人嘅招式都寫一個新Script係好傻豬的
我會建議從根本去改左佢

1 : ) 如果你真係點都想用番你已有嘅Scriprt,
可以用enum同Switch,直接例舉哂唔同嘅敵人,係Prefab入面Asign番係咩咁就可以暫時咁解決問題
https://ibb.co/hHz51hP
https://ibb.co/D1v8GGy
最易,但缺點好明顯,長久落去你只會越嚟越難Debug,

2 所有敵人都係用同一個Script
我唔知你係咩類型遊戲啦,如果係3D動作遊戲 每一個敵人嘅動作無非係:因應條件去揀一個動作,播動畫,出特效,生成攻擊Collider,等cooldown,再重覆。
我會將佢地變成一個個ScriptableObject,再save係prefab入面再係Runtime生成。
AI示意
https://ibb.co/7R3kb9W
Behaviour示意
https://ibb.co/52swPzR
ScriptableObject示意
https://ibb.co/VmGQPTj
Editor示意
https://ibb.co/Wnn1ryY

以上嘅方法都可以做到連技,call function之類
真心膠萬能俠 2024-06-03 18:46:30
放心 咁唔會容易啲揾的
gameObject名係唔太可靠嘅變量 可免則免
主要係你每次複製/生成都會唔同左,而且你唔小心禁禁下都可以唔小心改左名,後面多左個空白鍵你Debug半日都唔知咩事(我試過)
除非用Transfrom.Find()唔係我都唔會點用
我鐘意返工返學 2024-06-03 19:05:11
建議整個enemy class然後declare個virtual fire() 然後dragon等敵人inherit enemy然後override fire(). 喺enemy ai到aggregate一個enemy然後call fire()

至於每個的人有唔同攻擊,移動策略, 你可以睇下strategy pattern同埋template pattern
HongKonger1314 2024-06-03 19:10:55
了解下oop 先
車厘龜軍團 2024-06-03 19:13:12
brother 寫乜嘢game?
2015 2024-06-03 19:23:09
唔係咁寫的
你個問題係常見到有一個好重要既concept解決
叫Object Oriented Programming
你學完就明白點解你想解既問題唔會存在

又中 X-Y Problem
欲邀重生 2024-06-03 20:46:05
你啱,我冇考慮到 Instantiate 敵人嘅時候gameObject會改咗名

其實我想將唔同種類嘅敵人設計得分別大啲,可能有啲積極啲進攻,有啲積極啲防守,有啲淨係識走佬左閃右避之類。然後進攻/防守/走佬又會有唔同方法
但因為我未做晒角色設計所以唔肯定可唔可以所有敵人共用一張behaviour,只靠public改參數同招式做我想要嘅效果
我暫時打算寫住一個敵人嘅behaviour先,之後整其他敵人如果啱用依張behaviour再拆出嚟大家share用
不過你其他code都好啱用,多謝晒

另外我啱啱突然諗到,如果我每個敵人都係獨立一張behaviour
其實唔應該由共用嘅enemy_ai call behaviour,而應該由behaviour
嘅update() call enemy_ai做嘢,enemy_ai做完嘢再回傳結果畀behaviour繼續做
咁就唔需要call張唔知咩名嘅behaviour
欲邀重生 2024-06-03 20:52:21
我開上個post有巴打推薦oop嘅資料,睇咗少少未睇晒唔好意思
我暫時睇到嘅部份好似幫唔到我依個問題
我再認真研究下
欲邀重生 2024-06-03 20:54:18
新手啱啱開始學,class同override嗰啲都唔熟
會研究下
2015 2024-06-03 21:22:49
睇完OOP先喇
OOP 差唔多係第一堂就要學㗎喇
搞唔清楚好難玩
欲邀重生 2024-06-03 22:33:06
孖寶契仔 2024-06-03 23:11:18
戴個頭盔先 好耐無用過Unity 未必答得岩
應該要先 Get 敵人B 既 GameObject 然後先再用 GetComponent
var enemyB = GameObject.Find("enemyB");
dragon myComponentB = enemyB.GetComponent<dragon>();
myComponentB.fire();
騎野豬的生菜公主 2024-06-04 07:06:38
簡單黎講
唔係用一個master去控制哂N個object嘅行為
而係n個object各自處理各自嘅行為
唔需要名
ぱないの 2024-06-21 11:28:44
樓主初學C#,跌下撞下都好正常啫
我一開始寫react到用過d好迂迴嘅方法管理state
我鐘意返工返學 2024-06-23 20:43:25
再細分嘅話最好係controller控制嗰object
object只係一個representation, 真正知道咩時候應該做啲咩嘅係嗰controller
旋風管家一拳超人 2024-06-23 20:47:51
ask gpt
騎野豬的生菜公主 2024-06-23 21:48:04
unity寫game嘅反例: yandere simulator

遊戲公司派人幫佢寫game
但review完發現d code太爛
話要幫佢重寫
佢唔肯,因為重寫完佢唔識改新code

希望樓主唔好做第2個yandere dev
否則寫10年都上唔到架
助理工程師 2024-06-24 14:23:31
Dragon myComponentB = GameObject.GetComponent(myName) as Dragon;
吹水台自選台熱 門最 新手機台時事台政事台World體育台娛樂台動漫台Apps台遊戲台影視台講故台健康台感情台家庭台潮流台美容台上班台財經台房屋台飲食台旅遊台學術台校園台汽車台音樂台創意台硬件台電器台攝影台玩具台寵物台軟件台活動台電訊台直播台站務台黑 洞