Hi!
I am new to programming and I’m making my 1st game. I want to teleport my character to a knife that he threw. Please see the details below:
-
I tried transform.position = teleknife.transform.position; but this causes him to teleport to the location of the prefab. I learned that it should teleport to the clone. I don’t know how to do this hehe.
-
The coding is structured this way: The KNIFE is thrown by JARRED which inherits from CONTROL which inherits from CHARACTER. I’m sorry if the code seems confusing. I hope you guys can help! Please see the C# scripts below:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public abstract class Character1 : MonoBehaviour
{[SerializeField] protected Transform knifePos; [SerializeField] protected float movementSpeed; protected bool facingRight; [SerializeField] public GameObject knifePrefab; [SerializeField] protected Stat healthStat; [SerializeField] private EdgeCollider2D swordCollider; [SerializeField] private List<string> damageSources; public abstract bool IsDead { get; } public bool Attack { get; set; } public bool TakingDamage { get; set;} public Animator MyAnimator { get; private set; } public EdgeCollider2D SwordCollider { get { return swordCollider; } } // Use this for initialization public virtual void Start () { facingRight = true; MyAnimator = GetComponent<Animator>(); healthStat.Initialize(); //initializes the health bar so that it starts at full life } // Update is called once per frame void Update () { } public abstract IEnumerator TakeDamage(); public abstract void Death(); public void ChangeDirection() { facingRight = !facingRight; transform.localScale = new Vector3(transform.localScale.x * -1, transform.localScale.y * 1, 1); } public virtual void ThrowKnife (int value) { Physics2D.IgnoreLayerCollision(10, 11); if (facingRight) { GameObject tmp = (GameObject)Instantiate(knifePrefab, knifePos.position, Quaternion.Euler(new Vector3(0, 0, -90))); tmp.GetComponent<Knife>().Initialize(Vector2.right); } else { GameObject tmp = (GameObject)Instantiate(knifePrefab, knifePos.position, Quaternion.Euler(new Vector3(0, 0, 90))); tmp.GetComponent<Knife>().Initialize(Vector2.left); } } public virtual void MeleeAttack() { Physics2D.IgnoreLayerCollision(10, 11); SwordCollider.enabled = true; } public virtual void OnTriggerEnter2D(Collider2D other) { if (damageSources.Contains(other.tag)) { StartCoroutine(TakeDamage()); } }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public delegate void DeadEventHandler();
public class Control : Character1
{private static Control instance; public event DeadEventHandler Dead; public static Control Instance { get { if (instance == null) { instance = GameObject.FindObjectOfType<Control>(); } return instance; } } public Transform[] groundPoints; //points on the characters shoes for him to know if he is standing on solid ground public float groundRadius; public LayerMask whatIsGround; public bool airControl; public float jumpForce; private bool immortal = false; private SpriteRenderer spriteRenderer; [SerializeField] private float immortalTime; public Rigidbody2D MyRigidbody { get; set; } public bool Slide { get; set; } public bool Jump { get; set; } public bool OnGround { get; set; } public bool Crouch { get; set; } public override bool IsDead { get { if (healthStat.CurrentValue<= 0) { OnDead(); } return healthStat.CurrentValue <= 0; } } private Vector2 startPos; // Use this for initialization public override void Start() { base.Start(); startPos = transform.position; spriteRenderer = GetComponent<SpriteRenderer>(); MyRigidbody = GetComponent<Rigidbody2D>(); } private void Update() { if (!TakingDamage && !IsDead) { if (transform.position.y <= -14f) { Death(); } } HandleInput(); } // Update is called once per frame void FixedUpdate() { if (!TakingDamage&&!IsDead) { float horizontal = Input.GetAxis("Horizontal_P1"); // "HORIZONTAL" is the name of a unity feature for movement control. You can see it in Edit>Project Settings>Input. OnGround = IsGrounded(); HandleMovement(horizontal); Flip(horizontal); } } public void OnDead() { if(Dead!= null) { Dead(); } } //METHODS: private void HandleMovement(float horizontal) // The horizontal in the parenthesis gets its value from the float Horizontal = blah blah in the fixed update { if(!Attack && (OnGround||airControl)) { MyRigidbody.velocity = new Vector2(horizontal * movementSpeed, MyRigidbody.velocity.y); } if (Jump && MyRigidbody.velocity.y==0) { MyRigidbody.AddForce(new Vector2(horizontal * movementSpeed, jumpForce)); } MyAnimator.SetFloat("Speed", Mathf.Abs(horizontal)); if (Crouch) { MyRigidbody.velocity = new Vector2(0, MyRigidbody.velocity.y); } } public virtual void HandleInput() // where we put in controls (we can use this to make 2-3 player games { if (Input.GetKeyDown(KeyCode.W)) { MyAnimator.SetTrigger("jump"); } if (Input.GetKeyDown(KeyCode.Z)) { MyAnimator.SetTrigger("attack"); } if (Input.GetKeyDown(KeyCode.C)) { MyAnimator.SetTrigger("slide"); } if (Input.GetKey(KeyCode.S)) { MyAnimator.SetBool("crouch", true); } if (Input.GetKeyDown(KeyCode.X)) { MyAnimator.SetTrigger("throw"); } } private void Flip(float horizontal) { if (horizontal > 0 && !facingRight || horizontal < 0 && facingRight) { ChangeDirection(); } } private bool IsGrounded() { if (MyRigidbody.velocity.y <= 0) { foreach (Transform point in groundPoints) { Collider2D[] colliders = Physics2D.OverlapCircleAll(point.position, groundRadius, whatIsGround); for (int i=0;i<colliders.Length;i++) { if (colliders*.gameObject !=gameObject)*
{
return true;
}
}
}
}
return false;
}
public override void ThrowKnife (int value)
{
base.ThrowKnife(value);
}
private IEnumerator IndicateImmortal()
{
while (immortal)
{
foreach (Renderer r in GetComponentsInChildren())
r.enabled = false;
yield return new WaitForSeconds(.1f);
foreach (Renderer r in GetComponentsInChildren())
r.enabled = true;
yield return new WaitForSeconds(.1f);
}
}
public override IEnumerator TakeDamage()
{
if (!immortal)
{
healthStat.CurrentValue -= 10;
if (!IsDead)
{
MyAnimator.SetTrigger(“damage”);
immortal = true;
StartCoroutine(IndicateImmortal());
yield return new WaitForSeconds(immortalTime);
immortal = false;
}
else
{
MyAnimator.SetLayerWeight(1, 0);
MyAnimator.SetTrigger(“die”);
}
}
}
public override void Death()
{
MyRigidbody.velocity = Vector2.zero;
MyAnimator.SetTrigger(“idle”);
healthStat.CurrentValue = healthStat.MaxVal;
transform.position = startPos;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Jarred : Control
{
public GameObject teleknife;
public override void HandleInput() // where we put in controls (we can use this to make 2-3 player games
{
if (Input.GetKeyDown(KeyCode.W))
{
MyAnimator.SetTrigger(“jump”);
}
if (Input.GetKeyDown(KeyCode.Z))
{
MyAnimator.SetTrigger(“attack”);
}
if (Input.GetKeyDown(KeyCode.X))
{
MyAnimator.SetTrigger(“slide”);
}
if (Input.GetKey(KeyCode.S))
{
MyAnimator.SetBool(“crouch”, true);
}
if (Input.GetKeyDown(KeyCode.C))
{
MyAnimator.SetTrigger(“throw”);
}
if (Input.GetKeyDown(KeyCode.V))
{
MyAnimator.SetTrigger(“cast”);
}
}
private void Teleport()
{
transform.position = teleknife.transform.position;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent (typeof(Rigidbody2D))]
public class Knife : MonoBehaviour
{
public float speed;
private Rigidbody2D myRigidbody;
private Vector2 direction;
// Use this for initialization
void Start ()
{
myRigidbody = GetComponent();
- }*
void FixedUpdate()
{
myRigidbody.velocity = direction * speed;
}
-
// Update is called once per frame*
-
void Update () {*
-
}*
public void Initialize(Vector2 direction)
{
this.direction = direction;
}
void OnBecameInvisible()
{
Destroy(gameObject);
}
public void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag != “Player”)
Destroy(gameObject);
}
}