首页 > 解决方案 > 具有相同脚本的 2 个对象中的 1 个会破坏 Unity

问题描述

我在 Unity 中有一个 C# 脚本如果我将脚本添加到一个对象,一切都很好,但是当我添加两个或多个具有相同脚本的对象并且我运行游戏时,只有一个具有相同脚本的对象留下了具有相同脚本的其他对象破坏。我不明白为什么。该项目是 3D

这是脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Linq;
using DiscordUnity;
using DiscordUnity.API;
using DiscordUnity.State;
using System.Threading.Tasks;

public class Player : MonoBehaviour, IDiscordServerEvents, IDiscordMessageEvents, IDiscordStatusEvents
{
#region Singleton
    public static Player Singleton { get; private set; }

    protected virtual void Awake()
    {
        if (Singleton != null)
        {
            Destroy(gameObject);
            return;
        }

        Singleton = this;
        DontDestroyOnLoad(gameObject);
    }

    private void OnDestroy()
    {
        if (Singleton == this)
        {
            DiscordAPI.UnregisterEventsHandler(this);
            DiscordAPI.Stop();
            Singleton = null;
        }
    }
    #endregion

    public string botToken;
    public DiscordLogLevel logLevel = DiscordLogLevel.None;
    public Vector3 x1;
    public Vector3 x2;
    public Vector3 z1;
    public Vector3 z2;
    public string userid;

    protected virtual async void Start()
    {
        DiscordAPI.Logger = new DiscordLogger(logLevel);
        DiscordAPI.RegisterEventsHandler(this);
        await DiscordAPI.StartWithBot(botToken);
        Debug.Log("DiscordUnity started.");
    }

    private void Update()
    {
        DiscordAPI.Update();
    }

    public async void OnServerJoined(DiscordServer server)
    {

    }

    public void OnServerUpdated(DiscordServer server)
    {

    }

    public void OnServerLeft(DiscordServer server)
    {

    }

    public void OnServerBan(DiscordServer server, DiscordUser user)
    {

    }

    public void OnServerUnban(DiscordServer server, DiscordUser user)
    {

    }

    public void OnServerEmojisUpdated(DiscordServer server, DiscordEmoji[] emojis)
    {

    }

    public void OnServerMemberJoined(DiscordServer server, DiscordServerMember member)
    {
        
    }

    public void OnServerMemberUpdated(DiscordServer server, DiscordServerMember member)
    {

    }

    public void OnServerMemberLeft(DiscordServer server, DiscordServerMember member)
    {

    }

    public void OnServerMembersChunk(DiscordServer server, DiscordServerMember[] members, string[] notFound, DiscordPresence[] presences)
    {

    }

    public void OnServerRoleCreated(DiscordServer server, DiscordRole role)
    {

    }

    public void OnServerRoleUpdated(DiscordServer server, DiscordRole role)
    {

    }

    public void OnServerRoleRemove(DiscordServer server, DiscordRole role)
    {

    }

    //message events
    public async void OnMessageCreated(DiscordMessage message)
    {

    }

    public void OnMessageUpdated(DiscordMessage message)
    {

    }

    public void OnMessageDeleted(DiscordMessage message)
    {
        
    }

    public void OnMessageDeletedBulk(string[] messageIds)
    {

    }

    public async void OnMessageReactionAdded(DiscordMessageReaction messageReaction)
    {
        if (messageReaction.Member.User.Bot == null || messageReaction.Member.User.Bot == false)
        {
            if (messageReaction.UserId == userid)
            {
                if (messageReaction.Emoji.Name == "◀️")
                {
                    transform.Translate(x1);
                }

                if (messageReaction.Emoji.Name == "▶️")
                {
                    transform.Translate(x2);
                }

                if (messageReaction.Emoji.Name == "")
                {
                    transform.Translate(z1);
                }

                if (messageReaction.Emoji.Name == "")
                {
                    transform.Translate(z2);
                }
            }
        }
    }

    public void OnMessageReactionRemoved(DiscordMessageReaction messageReaction)
    {
        if (messageReaction.UserId == userid)
        {
            if (messageReaction.Emoji.Name == "◀️")
            {
                transform.Translate(x1);
            }

            if (messageReaction.Emoji.Name == "▶️")
            {
                transform.Translate(x2);
            }

            if (messageReaction.Emoji.Name == "")
            {
                transform.Translate(z1);
            }

            if (messageReaction.Emoji.Name == "")
            {
                transform.Translate(z2);
            }
        }
    }

    public void OnMessageAllReactionsRemoved(DiscordMessageReaction messageReaction)
    {

    }

    public void OnMessageEmojiReactionRemoved(DiscordMessageReaction messageReaction)
    {
        
    }


    // discord status events
    public void OnPresenceUpdated(DiscordPresence presence)
    {

    }

    public void OnTypingStarted(DiscordChannel channel, DiscordUser user, DateTime timestamp)
    {
        
    }

    public void OnServerTypingStarted(DiscordChannel channel, DiscordServerMember member, DateTime timestamp)
    {
        
    }

    public void OnUserUpdated(DiscordUser user)
    {

    }



    private async Task AddEmoji(string ChannelId,string messageId, string emoji)
    {
        await DiscordAPI.CreateReaction(ChannelId, messageId, emoji);
    }

    #region Logger
    public enum DiscordLogLevel
    {
        None = 0,
        Error = 1,
        Warning = 2,
        Debug = 3
    }

    private class DiscordLogger : DiscordUnity.ILogger
    {
        private readonly DiscordLogLevel level;

        public DiscordLogger(DiscordLogLevel level)
        {
            this.level = level;
        }

        public void Log(string log)
        {
            if (level >= DiscordLogLevel.Debug)
                Debug.Log(log);
        }

        public void LogWarning(string log)
        {
            if (level >= DiscordLogLevel.Warning)
            {
                Debug.LogWarning(log);
            }
        }

        public void LogError(string log, Exception exception = null)
        {
            if (level >= DiscordLogLevel.Error)
            {
                Debug.LogError(log);
                Debug.LogError(exception);
            }
        }
    }
    #endregion
}

请帮忙。

标签: c#unity3dobject

解决方案


 protected virtual void Awake()
{
    if (Singleton != null)
    {
        Destroy(gameObject);
        return;
    }

    Singleton = this;
    DontDestroyOnLoad(gameObject);
}

您正在摧毁除第一个对象之外的所有对象。如果您想要多个对象,则需要更改单例模式


推荐阅读