protected virtual void Start()
    {
        if (world == null)
        {
            world = World.Main;
        }
        if (trail == null)
        {
            trail = new List <CharacterTrail>(10);
        }
        audioSrc = GetComponent <AudioSource>();
        if (spriteRenderer == null)
        {
            spriteRenderer = GetComponentInChildren <SpriteRenderer>(false);
        }

        if (trailPrefab != null && trailStartLength > 0)
        {
            CharacterTrail prevTrail = null;
            for (int i = 0; i < trailStartLength; ++i)
            {
                CharacterTrail ct = Instantiate <CharacterTrail>(trailPrefab, world.transform);
                ct.character          = this;
                ct.previousTrail      = prevTrail;
                ct.transform.position = transform.position - curMoveDir * i * ct.spacing;
                trail.Add(ct);
                prevTrail = ct;
            }
        }
    }
    public void CutTrail(CharacterTrail trailPart)
    {
        if (trail == null || trailPart == null)
        {
            return;
        }

        int index = trail.IndexOf(trailPart);

        if (index < 0 || index >= trail.Count)
        {
            return;
        }

        int restCount = trail.Count - index;

        CharacterTrail[] rest = trail.GetRange(index, restCount).ToArray();
        trail.RemoveRange(index, restCount);
        if (rest != null)
        {
            foreach (CharacterTrail ct in rest)
            {
                Destroy(ct.gameObject);
            }
        }

        if (Length < 1)
        {
            InvokeDeath();
        }
    }