Reputation: 265
I have a ball in my scene that I want to move it forward in a constantly speed, so I made this code for the ball:
public float speed = 100f;
void FixedUpdate () {
//rb.AddRelativeForce(Vector3.forward * speed * Time.deltaTime);
transform.position += Vector3.forward * Time.deltaTime * speed;
//rb.AddForce(0, 0, speed *Time.deltaTime);
//rb.velocity = transform.forward * speed;
}
NB: I've tried all the codes you see in the comments (//...)
The problem is sometimes the ball is destroying by itself, and sometimes the speed decrease, or when the ball collide with other object it go forward and backward in a weird movement!
Here's the entire code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(AudioSource))]
public class PlayerMovement : MonoBehaviour {
public AudioSource audioSource1;
public AudioSource audioSource2;
public Transform BallDestroyEffect;
public ParticleSystem BallCollectEffect;
public ParticleSystem SpeedEffect;
public ParticleSystem FireWorksEffect;
public GameObject FloatingTextPrefab;
public GameObject ContinueButton;
public Rigidbody rb;
public float speed = 100f;
private int count;
public Text countText;
public Text winText;
bool gameStart;
private void Start()
{
BallCollectEffect.Stop();
FireWorksEffect.Stop();
ContinueButton.SetActive(false);
rb = GetComponent<Rigidbody>();
count = 0;
setcountText();
winText.text = "";
audioSource1 = GetComponent<AudioSource>();
audioSource2 = GetComponent<AudioSource>();
}
void FixedUpdate () {
//rb.AddRelativeForce(Vector3.forward * speed * Time.deltaTime);
//transform.position += Vector3.forward * Time.deltaTime * speed;
//rb.AddForce(0, 0, speed *Time.deltaTime);
//rb.velocity = transform.forward * speed;
rb.MovePosition(transform.position + transform.forward * speed);
}
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag ("Enemy"))
{
audioSource2.Play();
SpeedEffect.Stop();
rb.gameObject.SetActive(false);
Instantiate(BallDestroyEffect, transform.position, transform.rotation);
FindObjectOfType<GameManager>().EndGame();
}
if (collision.gameObject.CompareTag("End"))
{
ContinueButton.SetActive(true);
winText.text = "Level Completed!";
SpeedEffect.Stop();
FireWorksEffect.Play();
}
if(collision.gameObject.CompareTag("Glass"))
{
audioSource1.Play();
count = count + 3;
setcountText();
BallCollectEffect.Play();
if (FloatingTextPrefab)
{
ShowFloatingText();
}
}
}
void ShowFloatingText()
{
Instantiate(FloatingTextPrefab, transform.position, Quaternion.identity, transform);
}
void setcountText () {
countText.text = count.ToString();
}
}
Do you have any suggestions about that?
Upvotes: 0
Views: 101
Reputation: 15951
Rigidbody.MovePosition()
This should be used if you want to continuously move a rigidbody in each FixedUpdate.
Set
Rigidbody.position
instead, if you want to teleport a rigidbody from one position to another, with no intermediate positions being rendered.
Note the difference in those two sentences.
Upvotes: 1